tsi*_*kov 7 javascript random largenumber
我很长一段时间都在使用这个功能而且很满意.你可能已经看过它数百万次了.甚至在Math.random()的MDN文档的示例部分中也是如此!
function random(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min
};
Run Code Online (Sandbox Code Playgroud)
然而,当我在非常大的范围内调用它时,它表现得非常糟糕.以下是一些结果:
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
Run Code Online (Sandbox Code Playgroud)
几乎没有随意.所有数字都是均匀的.
我的问题是:克服这个问题的CANONICAL方法(如果有的话)是什么?我的印象是上面的随机函数是范围内随机数的首选函数.提前致谢.
一般来说,答案是不要使用 Math.random。它完成了工作,但并不是特别好。最重要的是,Javascript 中大于 0xffffffffUL 的任何数字都不会用整数值表示 - 它是一个 IEEE 754 值,其行为在 MDN 站点上注明:“请注意,JavaScript 中的数字是带有舍入的 IEEE 754 浮点数-最接近的偶数行为......”
这就是你所看到的。
如果您想要更大的随机数,那么您可能需要获取 Mersenne Twister 或 Blum-Blum-Shub 32 位随机整数值并将它们相乘。这将消除舍入问题。
| 归档时间: |
|
| 查看次数: |
2632 次 |
| 最近记录: |