关于网友提出的“ Javascript中怎么生成分布看上去更随机的伪随机数?”问题疑问,本网通过在网上对“ Javascript中怎么生成分布看上去更随机的伪随机数?”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: Javascript中怎么生成分布看上去更随机的伪随机数?
描述:比如想要生成 1-6 的伪随机数:
Math.random() * 6 + 1
如果执行多次的话,结果会出现:2 2 2...
的情况,如何让其分布看上去更随机?
解决方案1:只要是标准分布的随机序列,其必定是均匀的。
只是人会倾向於认爲,小概率事件不会出现在随机序列中。然而这是错的。
巨数法则告诉我们,小概率事件在多次执行仍不发生的概率,会很快地下降。
随机序列也有可能看起来不太随机。将一个硬币扔 100 次,得到一个序列,h 为正面 t 为反面,下面哪个序列是真实的抛硬币结果,哪个是脑补出来的?
序列 1:
tthhhhhtthhhhtthhthhhtthhhhttththhhtthhhhhhtthhhhh
htthhthhhthhhhthhththtttththtthhtthhhhhttthhththtt 序列 2:
hthtthhtthtthhhthtthtttththhthhththhhhthhtthtththh
hthhhthtththhhthttththhthhhthththhhhthhthttththhth
答案是序列 1。在一个完全随机的抛硬币过程中,100 次抛掷得到至少一个连续 6 次相同结果的序列的概率大于 80%,得到至少一个连续 5 次相同结果的序列的概率大于 90%。而在序列 2 里,最长的一串连续序列的长度仅有 4。一列伪造的硬币随机数为了让自己看起来更随机,可能会频繁变化正反,但正是这一点反而出卖了它的伪随机本质。
http://zhuanlan.zhihu.com/chenqin/19927854
而使其看上去更随机的方法,就如上所说,频繁变换正反。
function pseudoPseudoRandom(threshold) {
var l = NaN;
return function() {
var i;
do {
i = Math.random();
} while (Math.abs(l - i) < threshold);
return l = i;
}
}
var pseudoCoin = pseudoPseudoRandom(0.5);
for (var i = 0; i < 100; ++i) {
pseudoCoin();
}
以上介绍了“ Javascript中怎么生成分布看上去更随机的伪随机数?”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/1795024.html