神呐, 为什么

wjj904922993 2012-02-06 05:57:55
已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10。
(参考答案:这题主要考的是对概率的理解。程序关键是要算出rand10,1到10,十个数字出现的考虑都为10%.根据排列组合,连续算两次rand7出现的组合数是7*7=49,这49种组合每一种出现考虑是相同的。怎么从49平均概率的转换为1到10呢?方法是:
1.rand7执行两次,出来的数为a1.a2.
2.如果a1*7+a2<40,b=(a1*7+a2)/10+1,如果a1*7*a2>=40,重复第一步)。
问问这个是为什么?
...全文
179 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjj904922993 2012-02-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wjj904922993 的回复:]

能的 , 但是不知道为什么 ? 你可以弄个代码试试
[/Quote]
我开始不淡定了,买了本盗版的书
wjj904922993 2012-02-10
  • 打赏
  • 举报
回复
不好意思,写错了,这里应该是
2.如果a1*7+a2<40,b=(a1*7+a2)/10+1,如果a1*7+a2>=40,重复第一步)。
wjj904922993 2012-02-10
  • 打赏
  • 举报
回复

这个事源代码 ,大家 亮一亮
01.int rand7()
02.{
03. return rand()%7+1;
04.}
05.
06.int rand10()
07.{
08. int a71,a72,a10;
09. do
10. {
11. a71= rand7()-1;
12. a72 = rand7()-1;
13. a10 = a71 *7 + a72;
14. } while (a10>= 40);
15. return (a71*7+a72)/4+1;
16.}
巴山独钓 2012-02-07
  • 打赏
  • 举报
回复
a1 = rand7() ;
a2 = rand7() ;
N = a1*7+a2 ;
if 10 <= N <19 then // 任取一个10的区间[10,19], [20,29], [30,39]
b = N % 10 + 1 ;
fi
fight_flight 2012-02-07
  • 打赏
  • 举报
回复
我给出一种可行的方法。
算法分为两轮。

第一轮:调用rand7(),若值为6或7则重新进行第一轮调用rand7(),直到其值在1~5之间。此时得到1,2,3,4,5的概率均为1/5。
比如取得1的概率为1/7+2/7*1/7+(2/7)^2*1/7+....+(2/7)^n*1/7=1/5(n为无穷)。
然后进入第二轮。


第二轮:调用rand7(),若其值为7再次进行第二轮调用rand7(),直到其值在1~6之间。此时进行模2操作,判断结果是否为零。因此第一轮的5种情况的每一种又可以分为两种概率均为1/2的情况。因此共有10中情况,且每种情况概率为1/10.
Huangpc123 2012-02-07
  • 打赏
  • 举报
回复
1.rand7执行两次,出来的数为a1.a2.
2.如果a1+a2-1<11,b=a1+a2-1,如果a1+a2-1>=11,重复第一步。
这样也可以吧
思路是a1+a2-1是1-13的随机数,并且每个数出现的概率相等,那么出现1-10的数中的每个数的概率也是相等的,然后把大于10的数重新再取,直到小于等于10为止,这样就可以取得1-10的随机数的每个数的概率都是相等的了,
巴山独钓 2012-02-07
  • 打赏
  • 举报
回复
a1*7+a2 的数据分布:8, 9, 10, ..., 56
取小于40的数位:8, 9, 10, ..., 39
然后,除以10,得到的1,2,3的概率相同,0的概率小很多
显然不正确。
Jokul_Lee 2012-02-07
  • 打赏
  • 举报
回复
应该是
b=(a1*7+a2)%10+1
Jokul_Lee 2012-02-07
  • 打赏
  • 举报
回复
[Quote=引用楼主 wjj904922993 的回复:]
已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10。
(参考答案:这题主要考的是对概率的理解。程序关键是要算出rand10,1到10,十个数字出现的考虑都为10%.根据排列组合,连续算两次rand7出现的组合数是7*7=49,这49种组合每一种出现考虑是相同的。怎么从49平均概率的转换为1到10呢?方法是:
1.rand7执行两次,出……
[/Quote]
b 小于5 啊亲
巴山独钓 2012-02-07
  • 打赏
  • 举报
回复
参考答案不可能是正确的吧
wjj904922993 2012-02-07
  • 打赏
  • 举报
回复
能的 , 但是不知道为什么 ? 你可以弄个代码试试
昵称很不好取 2012-02-06
  • 打赏
  • 举报
回复
这个能得出1-10?

33,028

社区成员

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

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