![](/img/trans.png)
[英]`numpy.empty()` and `numpy.random.rand()` same or different
[英]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值进行计算。 (根据逼近误差与直接计算中累积的舍入误差的比较方式,逼近甚至可能更加准确。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.