Процентный шанс что-то сказать?
Как это сделать?
- В 80% случаев он скажет
sendMessage("hi");
- 5% времени, когда он скажет
sendMessage("bye");
- и в 15% случаев он скажет
sendMessage("Test");
Нужно ли что-то делать с Math.random()?
как
if (Math.random() * 100 < 80) {
sendMessage("hi");
}
else if (Math.random() * 100 < 5) {
sendMessage("bye");
}
Ответы
Ответ 1
Да, Math.random()
- отличный способ добиться этого. То, что вы хотите сделать, - вычислить одно случайное число, а затем принять решения на основе этого:
var d = Math.random();
if (d < 0.5)
// 50% chance of being here
else if (d < 0.7)
// 20% chance of being here
else
// 30% chance of being here
Таким образом, вы не упустите возможности.
Ответ 2
Для таких случаев обычно лучше всего создать одно случайное число и выбрать случай, основанный на этом единственном числе, например:
int foo = Math.random() * 100;
if (foo < 80) // 0-79
sendMessage("hi");
else if (foo < 85) // 80-84
sendMessage("bye");
else // 85-99
sendMessage("test");
Ответ 3
Я сделал процентную вероятность, создав пул и используя алгоритм shuffle fisher yates для совершенно случайной случайности. Ниже приведен фрагмент ниже случайной случайности 20 раз.
var arrayShuffle = function(array) {
for ( var i = 0, length = array.length, swap = 0, temp = ''; i < length; i++ ) {
swap = Math.floor(Math.random() * (i + 1));
temp = array[swap];
array[swap] = array[i];
array[i] = temp;
}
return array;
};
var percentageChance = function(values, chances) {
for ( var i = 0, pool = []; i < chances.length; i++ ) {
for ( var i2 = 0; i2 < chances[i]; i2++ ) {
pool.push(i);
}
}
return values[arrayShuffle(pool)['0']];
};
for ( var i = 0; i < 20; i++ ) {
console.log(percentageChance(['hi', 'test', 'bye'], [80, 15, 5]));
}
Ответ 4
Вот очень простое приближенное решение проблемы. Сортируйте массив значений true/false произвольно, а затем выберите первый элемент.
Это должно дать 1 в 3 вероятности быть правдой..
var a = [true, false, false]
a.sort(function(){ return Math.random() >= 0.5 ? 1 : -1 })[0]