当N很大时均匀随机采样长度为N的二进制串

Uniformly randomly sample binary strings of length N when N is large

我希望生成一个长度为 N 的随机二进制字符串,以便均匀地随机选择每个可能的 2^N 个字符串。请注意,以相同的概率选择 1 或 0 来构建字符串是行不通的,因为字符串包含相等数量的 0 和 1 的概率很高,因此生成此类字符串的概率更高。另一种方法是生成所有 2^N 个字符串的列表,然后选择其中一个。但是,当 N 甚至是 30 时,这很快就变得不切实际了。我需要使用 N = 500。我该如何实现呢?如果 python 有一个内置的功能,那就更好了。

编辑 显然我提出了一个错误的问题;道歉。我想要的是对字符串中 1 的数量进行均匀分布。所以只有两个 1 的字符串应该和所有 1 的字符串一样可能。我可以做到这一点。

您误解了概率的工作原理。随机均匀地选取每个位会产生所需的分布。

这确实会生成具有大致相等数量的 0 和 1 的字符串,但这正是它应该做的,因为大多数可能的位串具有接近相等数量的 0 和 1。每个单独的可能位串仍有 1/2^N 的概率被选中。

(但这并不意味着您应该通过使用 random.choice 一次手动选择一个位来实现此目的。那会很慢。像 '{:0{}b}'.format(random.getrandbits(N), N) 这样的东西会更快。)