簡體   English   中英

如何通過javascript在很大范圍內生成隨機數?

[英]How to generate random numbers in a very large range via javascript?

我很長一段時間都在使用這個功能而且很滿意。 你可能已經看過它數百萬次了。 甚至在Math.random() 的MDN文檔的示例部分中也是如此

function random(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min
};

然而,當我在非常大的范圍內調用它時,它表現得非常糟糕。 以下是一些結果:

for(var i=0;i<100;i++) { console.log(random(0, 34359738368)) }

34064924616
6800671568
30945277424
2591785504
16404206304
29609031808
14821448928
10712020504
26471102024
21454653384
33180253592
28189739360
27189739528
1159593656
24058421888
13727549496
21995862272
20907450968
28767901872
8055552544
2856286816
28137132160
22775692392
21141911808
16418994064
28151646560
19928528408
11100796192
24022825648
17873139800
10310184976
7425284936
27043756016
2521657024
2864339728
8080550424
8812058632
8867252312
18571554760
19600873680
33687248280
14707542936
28864740112
26338252144
7877957776
28207487968
2268429496
14461565136
28062983608
5637084472
29651319832
31910601904
19776200528
16996597392
2478335752
4751145704
24803500872
21899551216
23144535632
19854787112
8490486080
14932659320
8625736560
11379900040
32357265704
33852039680
2826278800
4648275784
27363699728
14164020752
22279817656
25238815424
16569505656
30065335928
9904863008
26944796040
23179908064
19887944032
27944730648
16242926184
6518696400
25727832240
7496221976
19014687568
5685988776
34324757344
12538943128
21639530152
9532790800
25800487608
34329978920
10871183016
23748271688
23826614456
11774681408
667541072
1316689640
4539806456
2323113432
7782744448

幾乎沒有隨意。 所有數字都是均勻的。

我的問題是: 克服這個問題的CANONICAL方法(如果有的話)是什么? 我的印象是上面的隨機函數是范圍內隨機數的首選函數。 提前致謝。

WebCrypto API(所有主流瀏覽器都支持草稿)提供加密隨機數....

/* assuming that window.crypto.getRandomValues is available */

var array = new Uint32Array(10);
window.crypto.getRandomValues(array);

console.log("Your lucky numbers:");
for (var i = 0; i < array.length; i++) {
    console.log(array[i]);
}

W3C標准https://www.w3.org/TR/WebCryptoAPI/

這里的例子。 https://developer.mozilla.org/en-US/docs/Web/API/RandomSource/getRandomValues

答案一般是不要使用Math.random。 它完成了工作,但並不是特別好。 最重要的是,Javascript中大於0xffffffffUL的任何數字都不是由整數值表示的 - 它是一個IEEE 754值,其行為在MDN網站上注明:“請注意,JavaScript中的數字是帶有圓形的 IEEE 754浮點數- 最接近甚至的行為 ....“

這就是你所看到的。

如果你想要更大的隨機數,那么你可能需要得到像Mersenne Twister或Blum-Blum-Shub這樣的32位隨機整數值並乘以它們。 這將消除四舍五入的問題。

多數民眾贊成! 嗯,你知道在計算機上沒有真正隨意的東西。 總是使用一種算法。 所以你找到了一個數字導致這個特定算法的偶數。 我試了一下,這不一定是由大數字引起的。 更有可能是某種數字因素分解。 只要嘗試另一個數字,如果你願意,甚至更大,你應該得到不均勻的輸出。 防爆。 134359738368甚至更大並沒有排除所有奇數或偶數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM