目前,抛开与伪随机数生成器相关的任何问题并假设 numpy.random.rand
从 [0, 1)
上 float 的离散分布中完美采样。在结果中获得至少两个完全相同的 float 的几率是多少:
numpy.random.rand(n)
对于任何给定的n
值?
从数学上来说,我认为这相当于首先问有多少 IEEE 754 singles或doubles区间[0, 1)
中有。那么我想下一步将是解决等效的 birthday problem ?我不太确定。有人有一些见解吗?
最佳答案
numpy.random.rand
执行的计算对于每个元素生成一个数字 0.<53 random bits>
,总共 2^53 个同样可能的输出。 (当然,内存表示不是定点 0.stuff
;它仍然是浮点。)此计算无法生成 0 到 1 之间的大多数二进制 64 float ;例如,它不能产生 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;
}
(请注意,无论 rk_random
的大小如何,long
都会生成 32 位输出。)
假设有一个完美的随机源,numpy.random.rand(n)
中的重复概率是 1-(1-0/k)(1-1/k)(1-2/k)...(1-(n-1)/k),其中 k=2^53。最好使用 approximation而不是直接计算较大的 n 值。 (近似值甚至可能更准确,具体取决于近似误差与直接计算中累积的舍入误差的比较情况。)
关于python - numpy.random.rand(n) 中重复的几率是多少(假设完全随机性)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53505789/