python - 当 N 很大时,均匀随机采样长度为 N 的二进制字符串
问题描述
我希望生成一个长度为 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)
会更快。)
推荐阅读
- deep-learning - Deep CNN 的低准确率
- javascript - 为什么我的闭包函数不想在 if 语句中重新分配其父函数变量?
- java - 如何使用 GeoTools 恢复内存中形状的特征?
- python-3.x - 用 lambda 减少函数
- node.js - 使用 pkgcloud 在 OpenStack 中创建卷
- jquery - 比较 2 个表行中的列数据
- flutter - 使用 Signal R 的 Flutter 反应式编程(流)
- php - will print &® 中的版权符号
- c++ - 如何在 Linux C++ 中使用 ***sprintf_s***
- javascript - 用 JS 解析 JSON 嵌套数组