wake-up-neo.com

Prozentuale Chance etwas zu sagen?

Wie mache ich das so ..

  • In 80% der Fälle wird sendMessage("hi"); angezeigt.
  • In 5% der Fälle wird sendMessage("bye"); angezeigt.
  • und in 15% der Fälle wird sendMessage("Test");

Hat es etwas mit Math.random () zu tun? Gefällt 

if (Math.random() * 100 < 80) {
sendMessage("hi");
}
else if (Math.random() * 100 < 5) {
sendMessage("bye");
}
32
0x29A

Ja, Math.random() ist eine hervorragende Möglichkeit, dies zu erreichen. Was Sie tun möchten, ist eine einzelne Zufallszahl zu berechnen und danach Entscheidungen zu treffen:

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

So verpassen Sie keine Möglichkeiten.

42

In solchen Fällen ist es in der Regel am besten, eine eine Zufallszahl zu generieren und den Fall basierend auf dieser einzelnen Zahl zu wählen.

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

Ich habe eine prozentuale Zufallsfunktion erstellt, indem ich einen Pool erstellt habe und den Fisher-Yates-Shuffle-Algorithmus für eine zufällige Chance verwendet. Das folgende Snippet testet die Zufälligkeit 20 mal.

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