在Python中进行准随机化

1 投票
5 回答
697 浏览
提问于 2025-04-16 09:36

这是个问题:我想在两个元素之间随机选择n次(比如说选择[0,1],结果是0或1),最后我的列表应该有n/2个[0]和n/2个[1]。但是我得到的结果往往是这样的:[0 1 0 0 0 1 0 1 1 1 1 1 1 0 0,直到n]。问题是我不想让同一个数字连续出现4次或5次这么频繁。我知道可以使用一种接近随机的方式来解决这个问题,但我不知道该怎么做(我在用Python)。

5 个回答

1

连续出现六个1并不是特别不可能的事情——你确定你没有得到你想要的结果吗?

有一个简单的Python接口可以生成均匀分布的随机数,这正是你想要的吗?

2

你可以使用 random.shuffle 来打乱一个列表的顺序。

import random
n = 100
seq = [0]*(n/2) + [1]*(n-n/2)
random.shuffle(seq)

现在你可以遍历这个列表,每当你发现有一段连续的元素太长时,就可以交换一个元素来打断这个连续的序列。我还没有这部分的代码。

4

为了确保生成的零和一的数量相同,你可以先创建一个包含 n/2 个零和 n/2 个一的列表,然后用 random.shuffle 来打乱这个列表。

如果 n 较小,而你对结果不满意(比如说不想出现太多连续相同的数字),可以再打乱一次。不过要注意,这样做其实是 降低 结果的随机性,而不是增加。

如果 n 较大,使用这种方法找到符合你标准的结果会花费太长时间(因为大多数结果都不符合)。这时候你可以按照以下规则一个一个生成数字:

  • 如果你已经生成了 4 个连续的 1,下一个数字必须是 0,反之亦然。
  • 否则,如果你还需要生成 x 个 1 和 y 个 0,下一个数字是 1 的概率是 x/(x+y)。

撰写回答