简体   繁体   English

如何通过javascript在很大范围内生成随机数?

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

I was using this function for a long time and was happy with it. 我很长一段时间都在使用这个功能而且很满意。 You probably saw it millions of times. 你可能已经看过它数百万次了。 It is even in the example section of the MDN documentation for Math.random()! 甚至在Math.random() 的MDN文档的示例部分中也是如此

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

However when I called it on really large range it performed really poorly. 然而,当我在非常大的范围内调用它时,它表现得非常糟糕。 Here are some results: 以下是一些结果:

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

Hardly random at all. 几乎没有随意。 All numbers are even. 所有数字都是均匀的。

My question is this: What is the CANONICAL way (if any) to overcome this problem? 我的问题是: 克服这个问题的CANONICAL方法(如果有的话)是什么? I have the impression that the above random function is the go-to function for random numbers in range. 我的印象是上面的随机函数是范围内随机数的首选函数。 Thanks in advance. 提前致谢。

The WebCrypto API (supported in draft by all the major browsers) provides cryptographically random numbers.... 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 standard https://www.w3.org/TR/WebCryptoAPI/ W3C标准https://www.w3.org/TR/WebCryptoAPI/

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

The answer in general is don't use Math.random. 答案一般是不要使用Math.random。 It gets the job done, but it's not especially good. 它完成了工作,但并不是特别好。 On top of that, any number in Javascript greater than 0xffffffffUL isn't represented by integer values--it's an IEEE 754 value with a behavior noted on the MDN site: "Note that as numbers in JavaScript are IEEE 754 floating point numbers with round-to-nearest-even behavior ...." 最重要的是,Javascript中大于0xffffffffUL的任何数字都不是由整数值表示的 - 它是一个IEEE 754值,其行为在MDN网站上注明:“请注意,JavaScript中的数字是带有圆形的 IEEE 754浮点数- 最接近甚至的行为 ....“

And that's what you're seeing. 这就是你所看到的。

If you want larger random numbers, then you'll probably have to get something like Mersenne Twister or Blum-Blum-Shub 32-bit random integer values and multiply them. 如果你想要更大的随机数,那么你可能需要得到像Mersenne Twister或Blum-Blum-Shub这样的32位随机整数值并乘以它们。 That will eliminate the rounding-off problem. 这将消除四舍五入的问题。

Thats wierd! 多数民众赞成! Well you know there is no such thing as truly random when in comes to computers. 嗯,你知道在计算机上没有真正随意的东西。 There is always an algorithm used. 总是使用一种算法。 So you found a number that causes even's for this particular algorithm. 所以你找到了一个数字导致这个特定算法的偶数。 I tried it out, it isn't necessarily caused by large numbers. 我试了一下,这不一定是由大数字引起的。 More likely some kind of factorization of the number instead. 更有可能是某种数字因素分解。 Just try another number, even larger if you like and you should get output that isn't all even. 只要尝试另一个数字,如果你愿意,甚至更大,你应该得到不均匀的输出。 Ex. 防爆。 134359738368 which is even larger doesn't out all odd or even numbers. 134359738368甚至更大并没有排除所有奇数或偶数。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何在 javascript 中每 5 个数字的范围之间生成随机数 - How to generate random numbers between a range at every 5 numbers in javascript 如何使用JavaScript以非随机方式生成范围内的数字? - How to generate numbers within a range in a non random way with JavaScript? javascript:从范围生成2个随机但不同的数字 - javascript: generate 2 random but distinct numbers from range 生成随机数JavaScript - Generate random numbers javascript Javascript:生成范围内的随机数,避免前两个 - Javascript: generate random numbers in range, avoiding previous two 如何生成添加到特定数字并在JavaScript范围内生成的随机数? - How to generate random numbers that add up to a certain number and are generated in a range in JavaScript? 如何在与javascript中的固定总和匹配的范围内生成n个随机数? - How to generate n random numbers within a range matching a fixed sum in javascript? 如何根据提供的最小和最大字符范围在 Javascript 中生成随机数 - How to Generate Random numbers in Javascript based on the provided range Minimum and Maximum characters 如何生成无重复JavaScript的随机数 - How to generate random numbers with no repeat javascript 如何在Javascript中生成偏斜的随机数? - How to generate skewed random numbers in Javascript?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM