javascript - 使用 Math.random 获得相同值的概率

标签 javascript random probability entropy

要求是当用户点击提交按钮时向数据库发送一个唯一的 id。所以我正在使用 Javascript Math.random 方法。我只想知道获得相同数字的机会或可能性是多少,以及使用 Math.random 的位数是多少。

最佳答案

你遇到了一个叫做生日问题的问题:即使有 366 种可能的生日,当你在一个房间里只有 26 个人时,一些人生日相同的可能性要高于 50-50。一般来说,当您的数字接近样本量的平方根时(26 在 366 的平方根附近),很可能会发生冲突。

Javascript 的 Math.random() 具有大约 52 位的随机性。因此,当您的记录数接近 2**26(大约 6000 万条)时,应该很可能发生冲突,这对于数据库来说是一个相当适中的大小。

您应该使用至少 128 位(最好是 256 位)的加密安全 PRNG,以避免冲突。可能有现成可用的 UUID 库。

对于给定数量的键 k 和键空间 N,碰撞的近似几率为:

1 - exp((-k * (k-1))/(2 * N))

所以对于 k=100 万条记录,N=2**52,如果我算对的话,这大约是 9000 分之一。这进一步假设 Javascript 的 Math.random() 确实使用了可用的填充 52 位随机性……这也是我不会做出的假设。

关于javascript - 使用 Math.random 获得相同值的概率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28199100/

相关文章:

javascript - 在 Backbone 中,您是否在实例化之前定义模型的属性?

c++ - 生成随机数并将它们放入数组中

algorithm - 从区间返回数字的随机函数

python以不同的概率从不同的分布中抽样

javascript - HTML5 模式正则表达式密码匹配

javascript - 只循环 Mediaelement.js 视频 5 次

c# - 如何在分布式系统中生成重复概率低的标识符?

php - 事件的随机加权选择

keras - 如何在 keras 中计算非 0 或 1 的目标值的交叉熵

javascript - Jasmine 和 requireJs - 不匹配的匿名 define() 模块 :