【发布时间】:2016-01-21 06:55:19
【问题描述】:
我们都知道并喜欢numpy 函数random.rand,它“创建[s] 一个给定形状的数组并使用来自[0, 1) 上的均匀分布的随机样本传播[s]”:
>>> import numpy as np
>>> np.random.rand(3,2)
array([[ 0.14022471, 0.96360618], #random
[ 0.37601032, 0.25528411], #random
[ 0.49313049, 0.94909878]]) #random
如果我想要来自[0, 1] 上的均匀分布的随机样本,我有哪些选择? 注意细微差别: numpy 函数不包括 1;我想要的功能包括 1.
【问题讨论】:
-
在 float64 中,如果要包含完美的 1,则恰好有 2^52 分之一的机会发生。我的问题是,这真的重要吗?
-
另外,如果您要复制论文,您可能想弄清楚它是使用 Mersenne Twister(本机 python 实现)还是实际的真随机数生成器。
-
哈哈,是的。尝试复制实验结果始终是个问题。
-
我之前曾尝试回答您的问题(见下文),但与其他人一样,我强烈认为您不应该关心这个非常微小的差异。我还认为,如果这种差异对您很重要,您是否知道非规范化浮点数 en.wikipedia.org/wiki/Denormal_number ?简而言之,编码浮点数的密度在 [0,1] 中的各处并不均匀。我不确切知道 Numpy 是如何生成随机数的,但这样的事实也会让你感到不安。
-
难点:你为什么特别关心
1.0被排除在外?在[0.0, 1.0]范围内大约有 2^62 个不同的双精度浮点数。random.rand已经只能生成其中的一小部分——大约 500 分之一。(random.rand有 2^53 个可能的输出。)再缺少一个可能的输出值确实不会产生太大的影响。 IOW,只需使用[0, 1)范围;它与人工创建的[0, 1]随机范围在统计上无法区分。
标签: python numpy random probability