web-dev-qa-db-ja.com

何か言う確率は?

どうすればそれができますか..

  • sendMessage("hi");と言う時間の80%
  • sendMessage("bye");と言う時間の5%
  • そして、sendMessage("Test");と言う時間の15%

Math.random()で何かする必要がありますか?のような

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

はい、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

そうすれば、可能性を見逃すことはありません。

46

このようなケースでは、通常、one乱数を生成し、その単一の番号に基づいてケースを選択するのが最善です:

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

プールを作成し、フィッシャーイェーツシャッフルアルゴリズムを使用して完全にランダムなチャンスを獲得することにより、パーセントチャンス関数を作成しました。以下のスニペットは、偶然性を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]));
}
0
Jake