随机数生成器
2015-09-06 10:38
148 查看
题目一:已知rand7()可以产生1~7的7个数(均匀概率),利用rand7() 产 生 rand10() 1~10(均匀概率)。
int rand10(){ int temp1,temp2; do{ temp1=rand7(); }while(temp1>5);//产生1~5 do{ temp2=rand7(); }while(temp2>2);//产生1~2 return temp1+5*(temp2-1); }分析:rand7产生的数概率是一样的,即1~7出现的概率一样,由于对结果做了筛选只能产生1~5,并且其概率也是一样的,所以temp1出现1~5的概率为1/5,同理temp 1~2的概率为1/2.
1)temp1出现1~5的概率为1/5,temp2 1~2的概率为1/2,则5*(temp2-1)出现0,5的概率为1/2,所以如果要得到1~5的数,则5*(temp2-1)必须为0,所以num的概率为:1/2*1/5=1/10同理得到大于5时候的数的概率也是1/10
思路二:
int rand10()
{
int x=0;
do{
x=(rand7()-1)*7+rand7();
} while(x>40);
return x%10+1;
}
解释:
x=(rand7()-1)*7+rand7();
这里的x范围是1到49,等概率产生的,都是1/49
1到49之间有1到10,11到20,21到30,31到40,只要%10然后+1,就是等概率的1到10,但是41到49,不够1到10,其实while(x>20);while(x>30);都是对的,就是效率差了点。
另一个观点就是把x=(rand7()-1)*7+rand7() 看成2位的7进制数。
相关文章推荐
- Spring常见面试题
- jxb注解标签使用
- 《第一行代码》读书笔记(五)----广播
- 了解 JavaScript (4)– 第一个 Web 应用程序
- ffmpeg编程学习 ---chapter 01
- 第六章
- 设计模式之: 模板方法模式
- json教程系列(3)-JSONObject的过滤设置
- C语言中经socket接收数据的相关函数详解
- 基于共享内存多级hash设计
- Gson:比较两个JSON字符串是否完全相等
- oracle官网下载jdk各版本地址
- VS 快捷键
- Android的activity学习笔记
- 黑马程序员之正则表达式
- Grub在linux中的作用
- AsyncTask的使用
- 心得
- MAC在Finder栏显示所浏览文件夹路径的方法
- 如何开mac两个以上的FINDER窗口