【问题标题】:Uniformly randomly sample binary strings of length N when N is large当 N 很大时,均匀随机采样长度为 N 的二进制字符串
【发布时间】:2020-02-16 06:41:34
【问题描述】:

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

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

【问题讨论】:

  • 1/2 概率的 IID 采样不工作吗?得到M 的概率是(N choose M)/2**N。正好有 (N choose M) 字符串包含 M2^N 字符串,所以你确实恢复了均匀分布。

标签: python python-3.x sampling binary-string


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-03-01
    • 2011-12-04
    • 2015-11-19
    • 1970-01-01
    • 2013-02-28
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多