给您一个函数,比方说bin(),它将以相同的概率生成0或1。现在给出了一系列连续整数,a,b说。
编写一个函数,例如rand(),使用bin()以相同的概率在a,b范围内生成数字
发布于 2016-02-23 10:28:21
您需要的洞察力是,您的bin()
函数返回一个二进制数字或“位”。调用它一次会给出0或1。如果你两次调用它,就会得到两位b0
和b1
,它们可以合并为b1 * 2 + b0
,以相同的概率给出0、1、2或3中的一个。如果您三次调用它,您将得到三位b0
、b1
和b2
。把它们放在一起,得到b2 * 2^2 + b1 * 2 + b0
,给出一个{0,1,2,3,4,5,6,7}的成员,概率相等。依此类推,你想要多少就多少。
您的范围a,b有m = b-a+1
值。您只需要足够的位来生成介于0和2^n-1
之间的数字,其中n
是使2^n-1
大于或等于m
的最小值。然后,只需在a
上进行调整,您就可以了。
假设你得到的范围是20,30。那里有11个数字,从20到30 (含)。11大于8 (2^3),但小于16 (2^4),因此需要4位。使用bin()
生成四位b0
、b1
、b2
和b3
。把它们放在一起作为x = b3 * 2^3 + b2 * 2^2 + b1 * 2 + b0
。您将得到一个结果,x
,介于0到15之间。如果x> 11,则生成另外4位。当x <= 11时,您的答案是x + 20
。
发布于 2016-02-23 09:59:53
帮助,但没有密码:
发布于 2016-02-23 10:37:56
减去数字,计算出你的范围:
Decimal: 20 - 10 = 10
Binary : 10100 - 01010 = 1010
计算出表示以下内容所需的位数:4
。
对于其中的每一个,生成一个随机的1或0:
num_bits = 4
rand[num_bits]
for (x = 0; x < num_bits; ++x)
rand[x] = bin()
假设在此之后是rand[] = [0,1,0,0]
。将此数字添加到范围的开始。
Binary: 1010 + 0100 = 1110
Decimal: 10 + 4 = 14
https://stackoverflow.com/questions/35574182
复制相似问题