生成整数的随机数组,每个整数都有若干个外观



我需要在 Python 中创建一个 6 到 5 之间的整数的随机数组,但我还有另一个数据说 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)])

即使我可以增加概率,这也应该有效。对此的任何帮助不胜感激。

您可以创建一个计数最多的数据池,然后从那里选择:

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,因为变量result中已经有 5 个数字。

您可以根据字典测试计数

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)

最新更新