Javascript中怎么生成分布看上去更随机的伪随机数?

发布于 2022-08-31 20:13:18 字数 102 浏览 12 评论 0

比如想要生成 1-6 的伪随机数:
Math.random() * 6 + 1
如果执行多次的话,结果会出现:2 2 2...
的情况,如何让其分布看上去更随机?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

哀由 2022-09-07 20:13:18

只要是標準分佈的隨機序列,其必定是均勻的。

只是人會傾向於認爲,小概率事件不會出現在隨機序列中。然而這是錯的。

巨數法則告訴我們,小概率事件在多次執行仍不發生的概率,會很快地下降。

随机序列也有可能看起来不太随机。将一个硬币扔 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();
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文