web-dev-qa-db-fra.com

Pourcentage de chance de dire quelque chose?

Comment puis-je le faire ainsi ..

  • 80% du temps, il dira sendMessage("hi");
  • 5% du temps, il dira sendMessage("bye");
  • et 15% du temps, il dira 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");
}
32
0x29A

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é.

42

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");
16
sarnold

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]));
}

0
Jake