首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >生成等概率数

生成等概率数
EN

Stack Overflow用户
提问于 2016-02-23 09:54:58
回答 4查看 1.4K关注 0票数 3

给您一个函数,比方说bin(),它将以相同的概率生成0或1。现在给出了一系列连续整数,a,b说。

编写一个函数,例如rand(),使用bin()以相同的概率在a,b范围内生成数字

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-02-23 10:28:21

您需要的洞察力是,您的bin()函数返回一个二进制数字或“位”。调用它一次会给出0或1。如果你两次调用它,就会得到两位b0b1,它们可以合并为b1 * 2 + b0,以相同的概率给出0、1、2或3中的一个。如果您三次调用它,您将得到三位b0b1b2。把它们放在一起,得到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()生成四位b0b1b2b3。把它们放在一起作为x = b3 * 2^3 + b2 * 2^2 + b1 * 2 + b0。您将得到一个结果,x,介于0到15之间。如果x> 11,则生成另外4位。当x <= 11时,您的答案是x + 20

票数 5
EN

Stack Overflow用户

发布于 2016-02-23 09:59:53

帮助,但没有密码:

  • 您可以轻松地将范围0、2 ** n转换为a,a+2 ** n。
  • 你可以很容易地从0,2**n-1中产生一个相等的概率。
  • 如果您需要的数字不是2的幂,只需生成一个最多2 ** n的数字,如果它超过所需的数,则重新滚动。
票数 2
EN

Stack Overflow用户

发布于 2016-02-23 10:37:56

减去数字,计算出你的范围:

代码语言:javascript
运行
复制
Decimal: 20 - 10 = 10
Binary : 10100 - 01010 = 1010

计算出表示以下内容所需的位数:4

对于其中的每一个,生成一个随机的1或0:

代码语言:javascript
运行
复制
num_bits = 4
rand[num_bits]
for (x = 0; x < num_bits; ++x)
  rand[x] = bin()

假设在此之后是rand[] = [0,1,0,0]。将此数字添加到范围的开始。

代码语言:javascript
运行
复制
Binary: 1010 + 0100 = 1110
Decimal: 10 + 4 = 14
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35574182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档