当N很大时,对长度为N的二进制字符串进行均匀随机采样



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

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

您误解了概率是如何工作的。随机地均匀地拾取每个比特可以精确地产生所需的分布。

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

(但这并不意味着你应该用random.choice手动一次选择一个比特来实现这一点。这会很慢。像'{:0{}b}'.format(random.getrandbits(N), N)这样的东西会更快。(

最新更新