JavaScript Math.Random()在一行中创建相同数字两次的可能性有多大?

JavaScript Math.Random()在一行中创建相同数字两次的可能性有多大?,javascript,math,random,Javascript,Math,Random,这是正确的吗?使用- 看起来值介于.0000000000000000到.99999999999之间 发生两次的概率=p^2=(1/99999999999)^2=1.0 e-32 我想我遗漏了什么 另外,作为一个伪随机数生成器如何改变这种计算 谢谢。如果这些数字确实是随机的,你会期望它们出现的概率是1/p,所以两倍的概率是1/p^2 p的值并不完全是您拥有的值,因为数字在内部表示为二进制。计算出javascript中数字的尾数位数,并将其用于组合计数 “伪随机”部分更有趣,因为伪随机数生成器的属性

这是正确的吗?使用-

看起来值介于.0000000000000000到.99999999999之间

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

我想我遗漏了什么

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


谢谢。

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

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

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


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

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

原因是第一个数字可以是任何数字,第二个数字需要再次成为那个数字,这意味着我们根本不关心第一个数字。一行中两次获得相同数字的概率与一次获得任何特定数字的概率相同


在一行中两次获取某个特定数字,例如,在一行中获取两个0.5,将是p^2;然而,如果你只关心一行中的任意两个数字,那么它就是p。

在理想的数学世界中。random()将是绝对随机的,一个输出与另一个输出完全独立,这(假设p=产生任何给定数字的概率)任何值在紧接着一个值重复的情况下,结果可能是p^2(正如其他人已经说过的)

实际上,人们希望Math.random速度快,这意味着引擎使用伪随机数生成器。有许多不同类型的PRNG,但最基本的是线性同余生成器,它基本上是沿着以下线的函数:

s(n + 1) = some_prime * s(n) + some_value mod some_other_prime
如果使用这样的生成器,则在调用
random()
一些其他素数之前,不会看到重复的值。你可以保证


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

给定的号码,您得到2个的概率为(1/p)^2,但您得到2个相同号码(任意)的概率为1/p。这是因为第一个数字可以是任何数字,而第二个数字只需要与之匹配。

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


一个可能会影响伪随机性的因素是计算它们的速度太快,没有时间改变种子,所以它会产生相同的数字。我想大部分都会影响它,因为它依赖于种子。事实上,@Eric,这是不对的。周期性地改变种子实际上使数字不再随机,而且很可能减少随机性,因为初始状态以可计算的方式改变。有一些可爱的隐晦的加密缺陷以这种方式出现。@Charlie,这将取决于实现,我不知道JS random是如何工作的。当我开始编程时,这是我遇到的第一个问题,即重复相同的随机变量。我没读到标题,所以“汤米”我说的可能是错的。@Eric:没关系,所有答案都有帮助!有没有可能大于0,它可以生成相同的数字两次,用位和伪随机数表示?Charlie,也看看Tikhons的数学,也许p^2不正确?看起来像52位尾数:Tommy,这是一个解释问题。n_i是一个特殊值的概率为1/p。如果这些数字真的是随机的,那么n_i和n_i+1具有相同值的概率是1/p^2。但正如他所说,在整个PN序列中找到一对的概率是p。另一方面,它完全取决于您的PN生成器。“线性移位寄存器”生成器在某些意义上“不是很随机”,但仍然非常有用,它的两个序列值的概率正好等于0。Prob(n_i+1=n_i)=p,而不是p*p。我想是的。假设你有一个从1到6的骰子。滚动两个6的几率为1/(6*6);然而,滚动两个相同数字的概率是滚动两个一、两个二……等的概率之和。这是6*(1/(6*6))或者只是1//6。按定义,滚动两个6不等于滚动两个相同的数字吗?(这些例子中只有一个死亡,对吗?)好吧,区别在于“滚动两个数字”也包括滚动两个1、两个2、两个3……等等,而“滚动两个6”只是两个6——后者实际上是前者的子集。是的,@Tikhon Jelvis,你是对的,我在顶部的评论(现在已删除)并不有趣,因此,使用Math.Random()时,一行中永远不会有两个数字,只有在较旧的浏览器中才会出现(我在完成文章之前意外地点击了submit)。为了避免某些跟踪操作,浏览器现在可能会定期重新设置PRNG的种子,而不使用LCG等,这样就不再是真的了。当然,你也假设没有其他人在调用random()——如果你在计时器上调用random(),那么另一个页面可能会在你前面运行,并调用random()本身,这可能会改变事情。我
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();