生成随机整数数组,每个整数都有多个出现

时间:2018-09-28 17:49:50

标签: python random

我需要在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)])

即使我可以增加概率,也应该可以。任何帮助表示赞赏。

2 个答案:

答案 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)