一个有关随机整数的问题

shamrock19 2008-11-04 02:53:39
今天碰到一个问题:如果rand8()得到的是均匀分布的0~7的随机整数,那么怎么得到均匀分布的0~10的随机整数呢?
恳请大家解答,谢谢!
...全文
131 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
buaajjb 2009-04-30
  • 打赏
  • 举报
回复
个人认为调用了两次rand8就已经不再是均匀分布了,比如取值为0的概率就不是1/64了
glacier3d 2008-11-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 bottlebox 的回复:]
(rand8()*8+rand8())*11/64这个公式应该是有问题的。
要将最终结果放到11个均匀段上(0~10共11个等分概率),64/11=5.818。每个段对应的数是非整数的,实际的结果
(0-5)=>0;(6-11)=>1....(59-63)=>10.必然是有九段长为6,两段长为5。
[/Quote]

有道理,后来我也发现这个问题了,确实这里的量都是离散的,我当连续的思考了
所以,oo的才对
glacier3d 2008-11-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 litaoye 的回复:]
恩,ls几个方法都很好,个人比较偏向oo的

int rand11()
{
m = 100;
while(m > 54)
{
m = rand8() * 8 + rand8();
}
return m % 11;
}
[/Quote]

貌似调用rand8()的次数会增多,

当然了,这题解法多多
瓶盒 2008-11-05
  • 打赏
  • 举报
回复
(rand8()*8+rand8())*11/64这个公式应该是有问题的。
要将最终结果放到11个均匀段上(0~10共11个等分概率),64/11=5.818。每个段对应的数是非整数的,实际的结果
(0-5)=>0;(6-11)=>1....(59-63)=>10.必然是有九段长为6,两段长为5。
shamrock19 2008-11-05
  • 打赏
  • 举报
回复
谢谢大家的解答,受教了:)
绿色夹克衫 2008-11-05
  • 打赏
  • 举报
回复
恩,ls几个方法都很好,个人比较偏向oo的

int rand11()
{
m = 100;
while(m > 54)
{
m = rand8() * 8 + rand8();
}
return m % 11;
}
glacier3d 2008-11-04
  • 打赏
  • 举报
回复
首先,0~7是均匀分布的,由两个rand8()可以产生下列均匀分布的数对:
(0,0) (0,1) ... (0,7)
(1,0) (1,0) ... (1,7)
...
(7,0) (7,1) ... (7,7)
由联合概率的计算知,上述64个数对是均匀分布的,且可对应0~63共64个数(可以看作8进制);
现在将单位1均分成64段,则由上一布产生的随机数r(0<=r<=63)所在位置为r/64,要将最终结果放到11个均匀段上(0~10共11个等分概率),所以应该让r/64除以1/11。

所以,最终计算方式为:

rand8()*8+rand8()*11/64
glacier3d 2008-11-04
  • 打赏
  • 举报
回复
这题貌是没有看上去的那么简单,关键是最后0~10是均匀分布的
jakqigle 2008-11-04
  • 打赏
  • 举报
回复
用线性同余法自己写随机数呢?!在一定很大的整数范围内里的数对10求余,映射到0~10的中的相应数。
oo 2008-11-04
  • 打赏
  • 举报
回复
可以只舍弃大于54的值,对0-54的值对11取余,这样会快一点。
  • 打赏
  • 举报
回复
连续调用两次rand8(),就可以拼出0~63范围内均匀分布的整数。
对于超过10的数字进行舍弃,再调用两次rand8()...直到找到满足要求的数字为止。
这样得到0~10范围内的整数仍然是均匀分布的。

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧