Algorithm 如何从生成0/1的随机数生成器构建随机数生成器

Algorithm 如何从生成0/1的随机数生成器构建随机数生成器,algorithm,random,Algorithm,Random,随机数生成器以相同的概率生成0或1 如何创建另一个随机数生成器,该生成器可以生成0到N之间的任何整数将N转换为二进制。获取位数(例如n)。现在用你的生成器生成n个随机位。然后将新数字转换为十进制数并除以N。您将得到0到N之间的值。很容易生成0到2^k-1范围内的随机数。 当n不是2的幂时,可以找到n

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


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

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

很容易生成0到2^k-1范围内的随机数。 当n不是2的幂时,可以找到n<2^k的最小k,然后重复生成0到2^k-1范围内的随机数,直到得到一个实际上
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
来自随机导入randint
从数学导入单元,日志
#生成随机位的测试函数:
def rand2():返回randint(0,1)
def rand2n(n):
#返回范围为0到2^n-1的随机整数
p=1
s=0
对于范围(n)中的i:
如果rand2()==1:s+=p
p*=2
返回s
def randn(n):
#返回范围为0,…,n-1的随机整数
k=ceil(对数(n,2))
尽管如此:
x=rand2n(k)
如果x
将二进制数系统与命中和未命中算法结合使用。大多数“随机”算法涉及查看系统时钟或一些巨大的乘法+模运算。真正的随机性不能真正编程。任何精心设计的算法都会完全按照你的指示去做。你能容忍什么样的偏见?如果你不能容忍任何错误,那么使用@JohnColeman建议。如果你能容忍一些偏倚,那么你可以考虑楼层(N*(R/ 2×*K)),其中K是N的位长,R是由随机方法提取的k个随机位组成的整数,而楼层函数内的算术是浮点。“某些偏差”->“某些值的可能性是其他值的两倍“。实际上,
k
应该比log2n大一点,以最小化偏差;假设乘法的结果是一个双字,也可以是字长。这会给你一个有偏差的结果。生成n位。如果结果太大,则将其丢弃并再生成n个位。重复此操作,直到数字在所需范围内。这将消除偏差。我如何知道偏差?假设你想要一个从0到11的数字。4位将为您提供从0到15的数字。您需要删除12、13、14和15的结果。如果你尝试使用它们,比如说使用
MOD 12
,那么你得到0、1、2、3的频率比4到11的频率要高。对它们都进行编码,并查看每一个的10000次运行的输出。感谢您的解释。