我需要在Python中创建一个1到5之间的6个整数的随机数组,但我还有另一个数据说a = [2 2 3 1 2],可以将其视为容量。这意味着1次最多可以发生2次或3次最多可以发生3次。
我需要为1到5的每个整数设置一个计数器,以确保每个整数不会由a [i]之外的随机函数生成。
这是我在python中创建的初始数组,但我需要了解如何确定上述条件。例如,我不需要类似[2 1 5 4 5 4]的解决方案,其中两次显示4或[2 2 2 2 1 2]。
solution = np.array([np.random.randint(1,6) for i in range(6)])
即使我可以增加概率,也应该可以。任何帮助表示赞赏。
答案 0 :(得分:3)
您可以创建一个计数最高的数据池,然后从中进行选择:
import numpy as np
a = [2, 2, 3, 1, 2]
data = [i + 1 for i, e in enumerate(a) for _ in range(e)]
print(data)
result = np.random.choice(data, 6, replace=False)
print(result)
输出
[1, 1, 2, 2, 3, 3, 3, 4, 5, 5]
[1 3 2 2 3 1]
请注意,数据是具有每个元素指定计数的数组,然后我们以这种方式从数据中随机选择,以确保您不会有更多的元素超出指定计数。
更新
如果您希望每个数字至少出现一次,则可以从每个数字的列表开始,从其余的数字中取样,然后随机播放:
import numpy as np
result = [1, 2, 3, 4, 5]
a = [1, 1, 2, 0, 1]
data = [i + 1 for i, e in enumerate(a) for _ in range(e)]
print(data)
result = result + np.random.choice(data, 1, replace=False).tolist()
np.random.shuffle(result)
print(result)
输出
[1, 2, 3, 3, 5]
[3, 4, 2, 5, 1, 2]
请注意,我从a
的每个原始值中减去了1,原始6
也更改为1
,因为变量{{1}中已经有5个数字}。
答案 1 :(得分:0)
您可以根据字典测试计数
import random
a = [2, 2, 3, 1, 2]
d = {idx: item for idx,item in enumerate(a, start = 1)}
l = []
while len(set(l) ^ set([*range(1, 6)])) > 0:
l = []
while len(l) != 6:
x = random.randint(1,5)
while l.count(x) == d[x]:
x = random.randint(1,5)
l.append(x)
print(l)