生成具有统一元素频率的随机洗牌列表



我想用 Django/Python 编写一个测试单元,我需要创建一个表,其中一列填充了从(1,2,3,4)中选择的整数,这样每个整数的频率是相同的,但列的顺序是随机的。

我正在尝试生成一个随机列表以创建此表。该列表应包含 64 个元素,并且应具有:

  • 16 个元素作为1
  • 16 个元素作为2
  • 16 个元素作为3
  • 16 个元素作为4

我尝试使用random.randint但结果列表没有均匀分布的元素。

我已经读过random.uniform但它似乎只是返回一个浮点数。

from random import uniform
for i in (range(1,65)):
r = uniform(1,4)

输出:

>>> r
1.184941440487669

您可以执行以下操作:

import random
a = [1,2,3,4]*16
random.shuffle(a)

random.shuffle 随机地将列表a原地打乱。然后,a的值将是一个具有给定元素频率的列表,随机排序。

如果你想要每个数字恰好出现 16 次,random.shuffle()就是要走的路。但是,如果您只想要一个随机数组,每个元素都具有相同的概率,则可以使用random.randrange().此函数接受与range()相同的参数。

请注意,这些数字不会以完全相同的频率出现,只会随机近似:

import random
a = [random.randrange(1,5) for _ in range(64)]
print(a)
for i in range(1,5):
print(i, 'occurs', a.count(i), 'times')

测试运行的输出:

[3, 4, 2, 1, 1, 4, 1, 1, 1, 2, 1, 3, 2, 3, 2, 3, 4, 3, 2, 3, 1, 4, 1, 4, 2, 2, 2, 2, 3, 4, 3, 2, 2, 4, 2, 3, 1, 4, 2, 4, 2, 2, 2, 1, 3, 4, 4, 3, 2, 1, 1, 2, 2, 4, 4, 3, 1, 3, 4, 1, 2, 2, 1, 3]
1 occurs 15 times
2 occurs 21 times
3 occurs 14 times
4 occurs 14 times

最新更新