我有一个依赖于JavaScript随机数的各种资源。 不过,我已经看到了很多问题,其中随机并非如此,因为随机的方式我生成随机数。
是否有任何JavaScript资源为我产生真正,或只是更好的随机号码?
我知道,我可以Random.org接口,但我有什么其他选择?
我正在使用:
function rand( lowest, highest){
var adjustedHigh = (highest - lowest) + 1;
return Math.floor(Math.random()*adjustedHigh) + parseFloat(lowest);
}
假设你不只是看到那里并没有任何模式,尝试Mersenee扭腰( 这里维基百科文章 )。 有喜欢各种实现这一个在github上 。
相似的,所以问题:
Seedable JavaScript随机数生成
如果你想要的东西更接近真正随机的,那么可以考虑使用random.org API获得真正的随机数,虽然我会使用种子,而不是为每一个数字,因为你需要通过他们的使用限制,以遵守只建议。
调整号码,以便他们“看起来是随机的”
我与菲尔^ h同意,人类是在即使在数字“完全随机”序列(发现他们往往认为他们看到图形的图形这么好的集群错觉 ,apophenia,赌徒谬误,等等)。
真正的随机位置的地块一般有大量的团块,并指出是“巧合”下跌非常接近,这看起来很可疑。
艺术家常常采取完全随机产生的图案和“轻推”,使它们显得 “更随机”,即使该轻推小心实际上使图案更小的随机的(a) , (b)中 , (c)中 , (d)等等。
或者, 低差异序列有时“看起来更好”不是一个真正的随机序列和更快产生。
快速随机数发生器
有很多“随机数发生器”横跨整个光谱,从“非常快”到“相对缓慢”,并从“易连人看到的模式”向“不可能的,无助的人类所能看到的任何模式”,以“加密安全并且,播种后,用足量的熵,据我们所知,从随机难以区分使用少于全部由人类一个月产生的能量的任何攻击。”
非加密强度的随机数生成器仍然提供优良的输出(不太可能无助的人类可能永远看不到任何模式)包括梅森捻线机 , 乘用携带的 , 滞后的斐波那契数生成器 , 那么equidistributed长周期线性 , Xorshift等。
加密的随机数技术,一些浏览器工作
我听说Cryptocat和其他JavaScript应用程序使用的方便window.crypto.getRandomValues()
或window.msCrypto.getRandomValues()
或SubtleCrypto.generateKey()
旨在生成加密随机数的功能。 不幸的是,该功能在IE 11和下方可用。
由于网络浏览器使用随机数的所有时间(每个“https://开头”网页,他们提取),它很可能是这些功能(如果有的话)可能比用JavaScript编写的大多数随机数生成速度更快 - 甚至非加密算法。
加密的随机数与技术,古今兼容的浏览器
在JavaScript中产生真正的随机数的方法之一是捕捉鼠标事件,并将它们添加到熵池,跟踪添加熵的一些(希望保守的)估计。 一旦池“满”(估计表明,熵的至少128位已被添加),使用一些加密安全随机数发生器从池中产生随机数 - 通常是使用单向散列,这样一个序列几千输出数字还不足以推导出熵池的状态,因此预测下一个输出编号。
一种实现: http://lightsecond.com/passphrase.html
延伸阅读
- window.crypto
- )window.crypto.getRandomValues的兼容性(
- 在JavaScript安全随机数?
- https://security.stackexchange.com/questions/20029/generate-cryptographically-strong-pseudorandom-numbers-in-javascript
- 是否有任何内置在IE和Webkit加密的随机数的浏览器支持? Firefox有window.crypto
- 在JavaScript中获得更好的随机函数
你可以通过请求一些数据不同步,因为performance.now()让你有时间精确到微秒生成随机数池。 然后使用响应时间作为盐在一个随机化算法,
var randomNumbers = [];
for(var i = 0; i < 10; i++) {
setTimeout(function () {
var timeStart = performance.now();
xhttp = new XMLHttpRequest();
xhttp.open('GET', 'https://cdn.polyfill.io/v2/polyfill.min.js?rand=' + Math.random(), true);
xhttp.onload = function () {
var timeEnd = performance.now() - timeStart;
var rNumber = parseInt(timeEnd.toString().replace('.', ''));
randomNumbers.push(rNumber)
};
xhttp.send();
}, i * 10);
}
有许多因素会影响这个时间:
这不是很好的生成数百万数的这种方式,但数。 也许串联几个结果,以获得良好的,长期的随机数。
我做了使用正弦和余弦函数生成使用Date.now()和新的Date()随机数的JavaScript库。的getTime()。 对于每一个随机数,我测试一下,看看如果该号码已被使用。 如果有,我重复这个过程,直到我得到一个新的号码。 如果我得到一个新的号码,我添加的号码所使用的列表,然后返回值。 在同一个库中,我还添加了一个随机测试,其循环通过随机数生成器并查找模式。 这是很好的这种方式,因为它快速加载数字(我console.time超时的话)而不必接触其它网页。
你可以在这里找到库:punbb.atspace.cc/scripts/libraries/random.js