首页 > 解决方案 > 当 N 很大时,均匀随机采样长度为 N 的二进制字符串

问题描述

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

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

标签: pythonpython-3.xsamplingbinary-string

解决方案


你误解了概率是如何工作的。随机均匀地选取每个位会产生所需的分布。

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

(不过,这并不意味着您应该通过手动选择一个位来实现这一点random.choice。这会很慢。类似的东西'{:0{}b}'.format(random.getrandbits(N), N)会更快。)


推荐阅读