【问题标题】:How to build a random number generator from a random number generator that generates 0 / 1如何从生成 0 / 1 的随机数生成器构建随机数生成器
【发布时间】:2017-12-15 19:46:16
【问题描述】:

随机数生成器以相等的概率生成 0 或 1

如何创建另一个随机数生成器,可以生成 0 到 N 之间的任何整数

【问题讨论】:

  • 将二进制数系统与命中和未命中算法结合使用。
  • 大多数“随机”算法都涉及查看系统时钟或一些巨大的乘法 + 模数。真正的随机性无法真正编程。任何设计良好的算法都会完全按照您的指示进行
  • 你能容忍什么样的偏见?如果你不能容忍任何然后使用@JohnColeman 建议。如果您可以容忍一些偏差,那么您可以考虑 floor( N * (r/2**k) ),其中 k 是 N 的位长度,r 是由从您的随机方法和算术中提取的 k 个随机位组成的整数floor函数里面是浮点数。
  • @JohnColeman 您能否详细解释一下如何执行此操作?
  • @jameskpolk:“一些偏见”->“某些值的可能性是其他值的两倍”。真的,k 应该比 log2 N 大一点,以最小化偏差;假设乘法的结果是双字,它也可能是字长。

标签: algorithm random


【解决方案1】:

生成 0 到 2^k - 1 范围内的随机数很容易。 当 n 不是 2 的幂时,您可以找到 n

from random import randint
from math import ceil,log

#a test function to generate random bits:
def rand2(): return randint(0,1)

def rand2n(n):
     #returns a random int in range 0 to 2^n - 1
     p = 1
     s = 0
     for i in range(n):
          if rand2() == 1:s += p
          p *= 2
     return s

def randn(n):
     #returns random int in range 0,...,n-1
     k = ceil(log(n,2))
     while True:
          x = rand2n(k)
          if x < n:
               return x #else, loop

【讨论】:

    【解决方案2】:

    将 N 转换为二进制。获取位数(比如 n)。现在使用您拥有的生成器生成 n 位随机位。然后将新数字转换为十进制并除以 N。你会得到介于 0 到 N 之间的数字。

    【讨论】:

    • 这会给你一个有偏见的结果。生成 n 位。如果结果太大,则将其丢弃并生成更多位。重复直到数字在所需范围内。这将消除偏见。
    • 我如何知道偏差?
    • 假设您想要一个从 0 到 11 的数字。4 位将为您提供从 0 到 15 的数字。您需要删除 12、13、14 和 15 的结果。如果您尝试使用它们,比如说MOD 12,那么你会比 4 到 11 更频繁地得到 0、1、2、3。对它们都进行编码并查看每个运行 10,000 次的输出。
    • 感谢您的解释。
    猜你喜欢
    • 2017-03-22
    • 2014-10-17
    • 2023-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多