给定一个正整数数组a
,目标是根据它们在数组中的权重生成5个随机数。
例如:
a = [2,3,4,4,4,4,4,6,7,8,9]
在这种情况下,数字4出现了5次,在这种情况下,数字4应该有5/11的概率出现。
不应重复任何数字。
答案 0 :(得分:5)
给定a
,一个正整数数组,首先需要计算每个整数的频率。例如,使用bincount
:
>>> a = [2,3,4,4,4,4,4,4,5,6,7,8,9,4,9,2,3,6,3,1]
>>> b = np.bincount(a)
b
告诉您a
中每个整数的频率。因此,相应的权重集是数组b/len(a)
。使用np.random.choice
这些权重和replace=False
可以为您提供所需内容:
>>> np.random.choice(np.arange(len(b)), 5, p=b/len(a), replace=False)
array([5, 9, 4, 3, 8])
>>> np.random.choice(np.arange(len(b)), 5, p=b/len(a), replace=False)
array([7, 4, 6, 9, 1])
>>> np.random.choice(np.arange(len(b)), 5, p=b/len(a), replace=False)
array([3, 7, 4, 9, 6])
如果您不使用正整数,或者使用大正整数,@ user2357112在下面的注释中指出np.unique
提供了另一种解决方案。在这里你写道:
>>> choices, counts = np.unique(a, return_counts=True)
>>> np.random.choice(choices, 5, p=counts/len(a), replace=False)
array([9, 8, 2, 4, 5])
答案 1 :(得分:0)
您可能正在寻找numpy.random.multinomial
例如,np.random.multinomial(1, [1/6.]*6, size=1)
投掷一次骰子。
获得结果后,您可以根据需要更新概率向量(必须总和为1)。例如numpy.random.multinomial(1, [1/2., 1/2., 0., 0., 0., 0.], size=1)
。
答案 2 :(得分:0)
最简单的解决方案(也许效率最低)可以如下:
import random
def get_randoms(n, a):
a = a[:]
r = []
for i in range(n):
r.append(random.choice(a))
a = [y for y in a if y != r[-1]]
return r
print get_randoms(5, [2,3,4,4,4,4,4,4,5,6,7,8,9,4,9,2,3,6,3,1])
输出可能类似于
[8, 2, 3, 6, 9]