掷骰子脚本均匀分布吗?(使用 Math.random())
Is roll-a-dice script evenly distributed ? (with Math.random())
对于这段脚本:
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)
这在现实世界中是实质性的/可以接受的吗?例如,公平地为jack-pop挑选客户。或计算赌博的可能性。
或者,我做错了什么?
附言我不是数学/科学专业的学生,所以我可能会错过很多数学概念。
这是一个简单的测试:
<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
。这对我来说看起来相当公平,但您可能需要运行几次并比较结果。
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
对于您的目的来说足够随机。
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 Google Chrome 的搜索结果:
Math.random() min bias: 2 max bias: 1270
rand() min bias: 2 max bias: 15
尝试下面的代码
var die = Math.floor((Math.random() * 10000 % 6) + 1);
尝试将 mod 值更改为较大的值。将其与大数相乘并将其修改为 6,在将其缩小到您的特定范围(即 0 - 5)之前,将给出很大的概率空间
试一试,看看结果是否可以接受。
Math.ceil()
不正确的原因是零是 Math.random()
函数的可能返回值。 从零向上舍入仍然是零。零显然不是有效的掷骰子。
尽管如此,考虑到返回值有 16 个小数点,这是一个极不可能的结果。
- 在指令控制器中使用$attrs时出现问题
- 如何使用jQuery自动打开页面上的所有链接
- 如何使用url加载程序在webpack中导入多个图像
- JS:如何在使用 Math.random() 时排除一系列值
- Javascript;使用math.random函数随机执行一个操作
- 掷骰子脚本均匀分布吗?(使用 Math.random())
- 无法正确使用Math.random
- Javascript单选按钮鼠标悬停在移动图像上,使用math.random
- 如何在 JavaScript 中使用 Math.random 进行测试
- 谷歌地图API使用Math.random获取随机位置 - JS
- 使用Math.random()生成均匀分布
- 使用math.random随机化网页
- 使用javascript中的Math.random()只生成2个特定的数字
- 使用Math.Random();修改CSS文件
- 如何在JavaScript中一起使用random和split函数
- 如何存储和重用使用Math.random()的文本输入值和变量值
- 为什么使用Math.random(),以及它的作用
- 是否可以在JavaScript中使用Math.random()*80来生成一个整数?
- 使用math.random()避免再次出现相同的值
- 为什么我不能使用 _.map(new Array(n), Math.random) 创建一个随机数组