Python numpy随机发生器有偏差吗?

Python numpy随机发生器有偏差吗?,python,numpy,random,Python,Numpy,Random,如果不同元素具有不同的概率,则numpy.random.choice方法可以生成无需替换的随机样本。但是,当我用 import numpy a = [0, 1, 2, 3, 4, 5] p = [0.1, 0.3, 0.3, 0.1, 0.1, 0.1] result = [0, 0, 0, 0, 0, 0] N = 1000000 k = 3 for i in range(0, N): temp = numpy.random.choice(a, k, False, p) f

如果不同元素具有不同的概率,则numpy.random.choice方法可以生成无需替换的随机样本。但是,当我用

import numpy

a = [0, 1, 2, 3, 4, 5]
p = [0.1, 0.3, 0.3, 0.1, 0.1, 0.1]
result = [0, 0, 0, 0, 0, 0]
N = 1000000
k = 3

for i in range(0, N):
    temp = numpy.random.choice(a, k, False, p)
    for j in temp:
        result[j] += 1
for i in range(0, 6):
    result[i] /= (N * k)
print(result)

第二和第三个元素只显示了25%的时间,这是一个很大的关闭。我尝试了不同的概率分布(例如,[0.1,0.2,0.3,0.1,0.1,0.2]),每次结果都不符合预期。我的代码有问题吗?或者numpy真的那么不准确吗?

您对
np.random.choice
函数的理解是错误的。特别是
replace=
选项。建议
replace=False
意味着一旦选择了某个项目,就不能再选择它。这可以通过运行

for _ in range(100):
    assert set(np.random.choice(np.arange(5), 5, replace=False)) == set(range(5))
看到没有任何错误被提出。顺序更改,但必须返回所有5个值

由于此属性,您当前的方法正在给出奇怪的结果。尽管1和2作为第一项出现的几率为0.3,但它们作为第二项或第三项出现的几率小于0.3,因为如果它们是第一项,则不可能是以后的项

解决方案显然是使用
replace=True
(或者忽略,
True
是默认值),如下所示:


您对
np.random.choice
函数的理解是错误的。特别是
replace=
选项。建议
replace=False
意味着一旦选择了某个项目,就不能再选择它。这可以通过运行

for _ in range(100):
    assert set(np.random.choice(np.arange(5), 5, replace=False)) == set(range(5))
看到没有任何错误被提出。顺序更改,但必须返回所有5个值

由于此属性,您当前的方法正在给出奇怪的结果。尽管1和2作为第一项出现的几率为0.3,但它们作为第二项或第三项出现的几率小于0.3,因为如果它们是第一项,则不可能是以后的项

解决方案显然是使用
replace=True
(或者忽略,
True
是默认值),如下所示:


使用
replace=True
选项进行
choice
功能。查看
排序(np.random.choice(列表(范围(10)),10,replace=False))
。它将始终是
[0,1,2,3,4,5,6,7,8,9]
。将
False
更改为
True
和/或将第二个
10
增加为
11
以获得更多信息。使用
choice
函数的
replace=True
选项。查看
排序(np.random.choice(列表(范围(10)),10,replace=False))
。它将始终是
[0,1,2,3,4,5,6,7,8,9]
。将
False
更改为
True
和/或将第二个
10
增加为
11
以获得更多信息。这是一个很好的答案-但请注意,您指向numpy文档的链接不会指向正确的位置(并且在文章开头的“您”而不是“您的”)一个很好的答案——但是请注意,你指向numpy文档的链接并没有指向正确的位置(以及文章开头的“你是”而不是“你的”)