Comment puis-je le faire ainsi ..
sendMessage("hi");
sendMessage("bye");
sendMessage("Test");
Doit-il faire quelque chose avec Math.random ()? Like
if (Math.random() * 100 < 80) {
sendMessage("hi");
}
else if (Math.random() * 100 < 5) {
sendMessage("bye");
}
Oui, Math.random()
est un excellent moyen de réaliser cela. Ce que vous voulez faire, c'est calculer un seul nombre aléatoire, puis prendre des décisions en fonction de cela:
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
De cette façon, vous ne manquerez aucune possibilité.
Pour de tels cas, il est généralement préférable de générer un nombre aléatoire et de sélectionner le cas en fonction de ce nombre unique, comme suit:
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");
J'ai créé une fonction de pourcentage de chance en créant un pool et en utilisant l'algorithme de Fisher Yates pour une chance totalement aléatoire. L'extrait ci-dessous teste le hasard de 20 fois.
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]));
}