Python:舍入误差扭曲了均匀分布
Python: rounding error distorts uniform distribution
我需要在 0 和 1 之间采样 10 个均匀分布的随机数。所以我认为 python 中的以下代码可以做到这一点:
positions = []
for dummy_i in range(1000000):
positions.append(round(random.random(),1))
然而,当将结果放入直方图中时,结果如下所示:
所以四舍五入似乎破坏了 random.random() 生成的均匀分布。我想知道是什么原因造成的,以及如何防止这种情况发生。谢谢你的帮助!
试试这个
positions = []
for dummy_i in range(10):
positions.append(random.randint (0, 10) / 10)
您创建直方图的方法有误。你应该大致得到:
0 和 1 为 50k
所有其他号码为 100k
但是你的第三个 bin 从 0.2 到 0.3(含),结果是 200k,而你的第四个 bin 从 0.3 到 0.4 不包括,结果是零。
尝试创建边缘为 0.05、0.15 等的直方图,这样您就不会出现这样的精度错误。
您的代码后面似乎有问题...(例如,在收集统计信息时)。检查这个较小的片段:
import random, collections
data = collections.defaultdict(int)
for x in range(1000000):
data[round(random.random(),1)] += 1
print(data)
你会看到 0
和 1
当然有大约一半的其他值的样本都非常均匀。
例如我得到:
defaultdict(<class 'int'>,
{0.4: 100083,
0.9: 99857,
0.3: 99892,
0.8: 99586,
0.5: 100108,
1.0: 49874, # Correctly about half the others
0.7: 100236,
0.2: 99847,
0.1: 100251,
0.6: 100058,
0.0: 50208}) # Correctly about half the others
我认为在这里使用 Numpy 可能更干净、更高效:
import numpy as np
positions = np.random.random(10000)
positions = np.round(positions, decimals=3)
我需要在 0 和 1 之间采样 10 个均匀分布的随机数。所以我认为 python 中的以下代码可以做到这一点:
positions = []
for dummy_i in range(1000000):
positions.append(round(random.random(),1))
然而,当将结果放入直方图中时,结果如下所示:
所以四舍五入似乎破坏了 random.random() 生成的均匀分布。我想知道是什么原因造成的,以及如何防止这种情况发生。谢谢你的帮助!
试试这个
positions = []
for dummy_i in range(10):
positions.append(random.randint (0, 10) / 10)
您创建直方图的方法有误。你应该大致得到:
0 和 1 为 50k
所有其他号码为 100k
但是你的第三个 bin 从 0.2 到 0.3(含),结果是 200k,而你的第四个 bin 从 0.3 到 0.4 不包括,结果是零。
尝试创建边缘为 0.05、0.15 等的直方图,这样您就不会出现这样的精度错误。
您的代码后面似乎有问题...(例如,在收集统计信息时)。检查这个较小的片段:
import random, collections
data = collections.defaultdict(int)
for x in range(1000000):
data[round(random.random(),1)] += 1
print(data)
你会看到 0
和 1
当然有大约一半的其他值的样本都非常均匀。
例如我得到:
defaultdict(<class 'int'>,
{0.4: 100083,
0.9: 99857,
0.3: 99892,
0.8: 99586,
0.5: 100108,
1.0: 49874, # Correctly about half the others
0.7: 100236,
0.2: 99847,
0.1: 100251,
0.6: 100058,
0.0: 50208}) # Correctly about half the others
我认为在这里使用 Numpy 可能更干净、更高效:
import numpy as np
positions = np.random.random(10000)
positions = np.round(positions, decimals=3)