使用Javascript真或更好的随机数(True or better Random numbers

2019-06-18 09:40发布

我有一个依赖于JavaScript随机数的各种资源。 不过,我已经看到了很多问题,其中随机并非如此,因为随机的方式我生成随机数。

是否有任何JavaScript资源为我产生真正,或只是更好的随机号码?

我知道,我可以Random.org接口,但我有什么其他选择?

我正在使用:

function rand( lowest, highest){
    var adjustedHigh = (highest - lowest) + 1;       
    return Math.floor(Math.random()*adjustedHigh) + parseFloat(lowest);
}

Answer 1:

假设你不只是看到那里并没有任何模式,尝试Mersenee扭腰( 这里维基百科文章 )。 有喜欢各种实现这一个在github上 。

相似的,所以问题:

Seedable JavaScript随机数生成

如果你想要的东西更接近真正随机的,那么可以考虑使用random.org API获得真正的随机数,虽然我会使用种子,而不是为每一个数字,因为你需要通过他们的使用限制,以遵守只建议。



Answer 2:

调整号码,以便他们“看起来是随机的”

我与菲尔^ 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中获得更好的随机函数


Answer 3:

你可以通过请求一些数据不同步,因为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);
}

有许多因素会影响这个时间:

  • 浏览器速度
  • 航线单程
  • 服务器响应时间
  • 回路由

这不是很好的生成数百万数的这种方式,但数。 也许串联几个结果,以获得良好的,长期的随机数。



Answer 4:

我做了使用正弦和余弦函数生成使用Date.now()和新的Date()随机数的JavaScript库。的getTime()。 对于每一个随机数,我测试一下,看看如果该号码已被使用。 如果有,我重复这个过程,直到我得到一个新的号码。 如果我得到一个新的号码,我添加的号码所使用的列表,然后返回值。 在同一个库中,我还添加了一个随机测试,其循环通过随机数生成器并查找模式。 这是很好的这种方式,因为它快速加载数字(我console.time超时的话)而不必接触其它网页。

你可以在这里找到库:punbb.atspace.cc/scripts/libraries/random.js



文章来源: True or better Random numbers with Javascript