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_nummber * 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

试一试看看结果是否可以接受。

于 2012-06-13T06:41:22.870 回答
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/,它为每种方法运行 20 次 100 万次硬币翻转的测试。Windows 谷歌浏览器的结果:

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

不正确的原因Math.ceil() 是因为零是Math.random()函数的可能返回值。从零四舍五入仍然为零。零显然不是有效的掷骰子。

然而,考虑到返回值有 16 个小数点,这是一个极不可能的结果。

于 2020-01-06T00:24:20.550 回答