【问题标题】:What are the chances that JavaScript Math.Random() will create the same number twice in a row?JavaScript Math.Random() 连续两次创建相同数字的可能性有多大?
【发布时间】:2011-05-26 06:57:17
【问题描述】:

这是正确的吗?使用 - http://en.wikipedia.org/wiki/Binomial_probability

看起来值是从 .0000000000000000 到 .9999999999999999

发生两次的概率 = p^2 = (1/9999999999999999)^2 = 1.0 e-32

我想我在这里遗漏了什么?

另外,作为一个伪随机数生成器如何改变这个计算?

谢谢。

【问题讨论】:

  • 一个可能会影响成为伪随机的方法,计算它们的速度如此之快,没有时间改变种子,所以它会产生相同的数字。我想主要会影响它,因为它会依赖于种子。
  • 实际上,@Eric,这是不正确的。定期更改种子实际上使数字不再随机,而且很可能随机性降低,因为初始状态以可计算的方式变化。以这种方式出现了一些可爱的、晦涩难懂的加密缺陷。
  • @Charlie,这将取决于实现,我不知道 JS 随机是如何工作的。当我开始编程时,这是我遇到相同随机重复的第一个问题。我错过了阅读标题,所以@Tommy 我说的可能是错误的。
  • @Eric:没关系,所有答案都有帮助!

标签: javascript math random


【解决方案1】:

在理想世界中,Math.random() 将是绝对随机的,一个输出完全独立于另一个输出,这(假设 p=产生任何给定数字的概率)导致任何可能的 p^2值被一个接一个地重复(正如其他人已经说过的那样)。

在实践中,人们希望 Math.random 速度快,这意味着引擎使用伪随机数生成器。 PRNG 有很多不同的种类,但最基本的是线性同余生成器,它基本上是一个函数:

s(n + 1) = some_prime * s(n) + some_value mod some_other_prime

如果使用这样的生成器,那么在您调用 random() some_other_prime 次之前,您不会看到重复的值。保证给你。

然而,最近很明显,这种行为(加上用当前时间播种 PRNG)可用于某些表单跟踪,这导致浏览器做了很多事情,这意味着你不能假设任何事情随后的random() 电话。

【讨论】:

  • 有趣,那么使用 Math.Random() 就不可能有两个连续的数字?
  • 仅在较旧的浏览器中(我在完成帖子之前不小心点击了提交)。为了避免某些跟踪操作,浏览器现在可能会定期重新设置 PRNG,不使用 LCG 等,这不再适用。
  • 当然,您还假设没有其他人在调用 random() - 如果您在计时器上调用 random()(例如),那么另一个页面可能会在您之前运行,并调用 random () 本身,这可能会改变事情。
  • 我只是将这些作为 PRNG 状态可能改变的其他方式的示例。在现代浏览器中,您不能保证不会看到重复的值。
【解决方案2】:

我认为连续得到两个数字的概率是1除以生成器的范围,假设它具有良好的分布。

原因是第一个数字可以是任何东西,而第二个数字只需再次是那个数字,这意味着我们根本不关心第一个数字。连续两次获得相同数字的概率与获得任何特定数字一次的概率相同。

连续两次获得某个特定数字,例如连续两个 0.5 秒,将是 p^2;但是,如果您只关心 any 连续两次的数字,那只是 p。

【讨论】:

  • 我想是的,是的。假设你有一个从 1 到 6 的骰子。掷出两个 6 的机会是 1/(6 * 6);但是,掷出两个相同数字的机会是掷出两个一、两个二等的概率之和。这是 6 * (1 / (6 * 6)) 或只是 1//6。
  • 根据定义滚动两个六与滚动两个相同的数字不一样吗? (在这些示例中只有 1 个死亡,对吧?)
  • 嗯,不同的是,“滚动两个数字”包括滚动两个一、两个二、两个三...等,而“滚动两个六”是 只有两个六——后者实际上是前者的一个子集。
  • 是的,@Tikhon Jelvis,你是对的,我在顶部的评论(现已删除)不是。
【解决方案3】:

如果这些数字真的是随机的,那么您确实会期望它们以 1/p 的概率出现,所以两倍就是 1/p^2。

p 的值并不完全是您所拥有的值,因为数字在内部被表示为二进制。找出数字在 javascript 中的尾数位数,并将其用于组合计数。

“伪随机”部分更有趣,因为伪随机数生成器的属性各不相同。 Knuth 在半数值算法中做了一些很好的工作,但基本上大多数常用的 PN 生成器至少有一些频谱分布。 Cryptograp0hic PN 生成器通常更强大。

更新:时间不应该很长。无论是毫秒还是一年,只要不更新状态,概率都会保持不变。

【讨论】:

  • 有没有机会大于0,可以两次生成相同的数字,分别用比特和伪随机表示?
  • 查理,也看看 Tikhons 的数学,也许 p^2 不正确?
  • 看起来像 52 位尾数:stackoverflow.com/questions/307179/…
  • 汤米,这是一个解释问题。 n_i 是一个特定值的概率是 1/p。如果数字真的是随机的,那么 n_i 和 n_i+1 具有相同值的概率是 1/p^2。但正如他所说,在 PN 序列的整个运行过程中找到一对的概率是 p。另一方面,它完全取决于您的 PN 生成器。一个“线性移位寄存器”生成器,在某些意义上“不是很随机”,但仍然非常有用,它的两个连续值的概率恰好等于 0。
  • 概率(n_i+1 = n_i) = p,不是 p*p。
【解决方案4】:

你得到 2 个给定数字的概率是 (1/p)^2,但你得到 2 个相同数字 (any) 的概率是 1/p。那是因为第一个数字可以是任何数字,而第二个只需要匹配它。

【讨论】:

    【解决方案5】:

    你可以找出来,让它运行几天:)

    var last = 0.1;
    var count = 0 | 0;
    function rand(){
        ++count;
        var num = Math.random();
        if(num === last){
            console.log('count: '+count+' num: '+num);
        }
        last = num;
    } 
    while(true) rand();
    

    【讨论】:

      猜你喜欢
      • 2019-01-04
      • 2011-04-15
      • 2015-01-29
      • 2012-10-21
      • 2021-01-18
      • 2010-11-22
      • 2015-09-24
      • 2020-09-15
      • 1970-01-01
      相关资源
      最近更新 更多