繁体   English   中英

numpy.random.rand(n)中重复的几率是多少(假设完全随机)?

[英]What are the odds of a repeat in numpy.random.rand(n) (assuming perfect randomness)?

目前,撇开与伪随机数生成器有关的所有问题,并假设numpy.random.rand完美地从[0, 1)的浮点数的离散分布中采样。 结果为至少两个完全相同的浮点数的几率是多少:

numpy.random.rand(n)

对于任何给定的n值?

从数学上讲,我认为这等同于首先询问区间[0, 1)有多少个IEEE 754单 那我想下一步将是解决同等的生日问题吗? 我不太确定 有人有见识吗?

numpy.random.rand对每个元素执行的计算将生成数字0.<53 random bits> ,总共有2 ^ 53个均等的输出。 (当然,内存表示形式不是固定点0.stuff ;它仍然是浮点数。)此计算无法产生大多数介于0和1之间的binary64浮点数;这种计算不能生成0。 例如,它不能产生1/2 ^ 60。 您可以在numpy/random/mtrand/randomkit.c查看代码:

double
rk_double(rk_state *state)
{
    /* shifts : 67108864 = 0x4000000, 9007199254740992 = 0x20000000000000 */
    long a = rk_random(state) >> 5, b = rk_random(state) >> 6;
    return (a * 67108864.0 + b) / 9007199254740992.0;
}

(请注意,无论long的大小如何, rk_random生成32位输出。)

假设是一个完美的随机源,则numpy.random.rand(n)中重复的概率为1-(1-0 / k)(1-1 / k)(1-2 / k)...(1- (n-1)/ k),其中k = 2 ^ 53。 最好是使用近似值,而不是直接对较大的n值进行计算。 (根据逼近误差与直接计算中累积的舍入误差的比较方式,逼近甚至可能更加准确。)

我认为您是对的,这就像生日问题。 但是您需要确定可能的选项数量。 您可以通过确定浮点数的精度来做到这一点。 例如,如果您决定在点后具有2个数字的精度,则有100个选项(包括零和不包括1)。

如果您有n个数字,那么不发生碰撞的可能性为:

在此处输入图片说明

或者给定R个可能的数字和N个数据点,则无冲突的可能性为:

在此处输入图片说明

且碰撞为1-P。

这是因为获得任何给定数字的概率为1 / R。 并且在任何时候,数据点不与先前数据点发生冲突的概率为(Ri)/ R,因为i是数据点的索引。 但是要获得没有数据点相互碰撞的可能性,我们需要将所有数据点不与之前碰撞的概率相乘。 应用一些代数运算,我们得到上面的方程。

(我会在LaTex中写一些方程式,但似乎这里没有选择的余地)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM