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

标签 python numpy floating-point probability ieee-754

目前,抛开与伪随机数生成器相关的任何问题并假设 numpy.random.rand[0, 1) 上 float 的离散分布中完美采样。在结果中获得至少两个完全相同的 float 的几率是多少:

numpy.random.rand(n)

对于任何给定的n值?

从数学上来说,我认为这相当于首先问有多少 IEEE 754 singlesdoubles区间[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/

相关文章:

python - Anaconda 3安装不成功

java - 为什么Java中没有ceil(float)?

python - 正则表达式:允许逗号分隔的字符串,包括字符和非字符

python - 使用 Python 确定图像是否存在于更大的图像中,如果存在,则找到它

python - 为什么 Numpy 不允许链接条件索引?

python - 导入tensorflow时出现numpy版本错误

c++ - 如何在 x86 程序集中移动两个 float 相乘的结果?

c - C中的 float 学获取随机数

python - Twisted RPC 消息聚合

python - 有人解析过维基词典吗?