0

このスクリプトの場合:

var die = Math.floor(Math.random()*6 + 1);

1 から 6 までの乱数を生成することが期待されます。

丸床前のダイス番号 6 は 6.0 から 6.999...999

ただし、丸床前のダイス番号1は1.00...001~1.99...999です。


さらに、(random_number * 6) であるため (数体系で「キャリー」?)

(1 ~ 1.9999) と (2 ~ 2.999) で生成される数が異なる可能性はありますか?

(おそらく差は 1 です)


これは現実世界で実質的/許容可能ですか? たとえば、ジャックポップの顧客を公平に選ぶことです。またはギャンブルの可能性を計算します。

それとも、私は何か間違ったことをしましたか?

ps 私は数学/科学の学生ではないので、多くの数学の概念を見落としている可能性があります。

4

6 に答える 6

3

簡単なテストを次に示します。

<div id="msg"></div>

<script type="text/javascript">

function rollDice() {
  return Math.random()*6 + 1 | 0; 
}

function testDice() {
  var results = [,0,0,0,0,0,0];
  var i = 100000;
  var n;

  while (i--) {
    results[rollDice()] += 1;
  }
  return results;
}

document.getElementById('msg').innerHTML = testDice();

</script>

IE では次のようになります,16768,16783,16546,16862,16447,16594。私にはかなり均一に見えますが、何度か実行して結果を比較する必要があるかもしれません。

于 2012-06-13T06:41:15.607 に答える
3

Math.random疑似乱数発生器です。真の乱数は生成されません。ただし、転造ダイに使用することはまったく問題ありません。次の JS フィドルを参照してください。

var roll = random.bind(null, 6); // Generate a random number from 1 to 6.

function keepRolling(times) {
    var die = [0, 0, 0, 0, 0, 0]; // How many times each number is rolled.
    for (var i = 0; i < times; i++) die[roll() - 1]++;
    return die;
}

var die = keepRolling(10000); // Roll the die 10000 times.

for (var i = 0; i < 6; i++) {
    alert("The number " + (i + 1) + " was rolled " + (die[i] / 100) + "% of the time.");
}

function random(range) {
    return Math.ceil(range * Math.random());
}

私が見るところMath.random、あなたの目的には十分にランダムです。

于 2012-06-13T06:45:29.957 に答える
2

以下のコードを試してください

var die = Math.floor((Math.random() * 10000 % 6) + 1);

mod値を大きな値に変更してみてください。大きな数を掛けて6に変更すると、特定の範囲(0〜5)に絞り込む前に大きな確率空間が得られます。

于 2012-06-13T06:37:43.160 に答える
2

firefox と google chromeのMath.random()実装は、均一な配布に関してはかなり悪いです (IE などはテストしていません)。自分で簡単に転がすことができます。

ここでテストできます: https://web.archive.org/web/20150905080518/http://www.merlyn.demon.co.uk/js-randm.htm#TRFP

ここに読むものがあります:https://web.archive.org/web/20120502223108/http://baagoe.com/en/RandomMusings/javascript/

また、jsfiddle http://jsfiddle.net/mVrdE/2/もあり、メソッドごとに 100 万回のコイン投げのテストを 20 回実行します。Windows Google Chrome の結果:

Math.random() min bias: 2 max bias: 1270 
rand() min bias: 2 max bias: 15
于 2012-06-13T07:42:28.287 に答える
2

試してみて、結果が許容できるかどうかを確認してください。

于 2012-06-13T06:41:22.870 に答える
1

が正しくない理由Math.ceil() は、ゼロがMath.random()関数への可能な戻り値であるためです。ゼロからの切り上げはゼロのままです。ゼロは明らかに有効なサイコロではありません。

それでも、戻り値が小数点以下 16 桁であることを考えると、非常にありそうもない結果です。

于 2020-01-06T00:24:20.550 に答える