算法导论 5.1-2
来源:互联网 发布:云狐网络科技园 编辑:程序博客网 时间:2024/06/05 07:24
一:描述random(a, b)过程的一种实现,它只调用random(0,1)。作为a和b的函数,你的程序期望运行时间是多少?
(参考答案:这题主要考的是对概率的理解。程序关键是要算出rand10,1到10,十个数字出现的考虑都为10%.根据排列组合,连续算两次rand7出现的组合数是7*7=49,这49种组合每一种出现考虑是相同的。怎么从49平均概率的转换为1到10呢?方法是:
1.rand7执行两次,出来的数为a1.a2.
Random(a,b)需满足的条件:
1)a、b之间的元素是等概率出现的
2)其概率=1/(b-a+1)
以下解题思路仅实现了---等概率出现,至于得到的概率<=1/(b-a+1)
解析:1·Random(0,1)可以等概率产生0、1,如果将(b-a+1)写成二进制形式,则可以用Random(0,1)产生的值(0或1)串起来表示(b-a+1),执行Random(0,1) p次后,得到的结果将是Random(0, 2^p),当2^p >= (b-a+1)时,实际上0~(b-a+1)【准确的说是0~2^p】之间的元素已经可以等概率出现了
2·分治法:
2.1分解,将a-b区间分成2部分,通过random(0,1)控制,则进入前半部和后半部的概率是一样的;
2.2.递归的处理前后两个部分,若问题足够小,即落到某个具体位置上时,则直接返回;
注意:当元素个数(b-a+1)不是2的幂次时,直接进行分治得不到等概率
元素;此时需要添加(b+1)、(b+2)、(b+3)···以使得元素个数等于2的幂次,然后再对a~(b+i)进行分治
#include <iostream>#include <cstdlib>#include <time.h>using namespace std;int random(int a , int b){ int p,m=1; //m用来保存2^p for(p=0 ; m<b-a+1; p++) //p是二进制位数 { m *= 2; //再用m保存十进制的值 } m = rand()%2; for(int i=0 ; i<p; i++) { m = m*2+rand()%2;//将生成的01串表示成十进制,注意每次都要左移,所以m*2 } if(m > b-a) { return random(a , b); } else { return m+a; }}int main(){ int a,b; cin >> a >>b;//输入3和7 srand(time (0) ); int m; int three , four , five , six , seven;//这几个变量用来统计3,4,5,6,7出现次数 three = four = five = six = seven=0; for(int i=0 ; i<1000 ; i++) { m = random(a , b); cout << m << endl; switch(m) { case 3: three++;break; case 4: four++;break; case 5: five++;break; case 6: six++;break; case 7: seven++; default:break; } } cout << three << ' ' << four << ' ' << five << ' ' << six << ' ' <<seven; return 0;}二:已知有个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,重复第一步)。参考代码如下所示
nt rand7() { return rand()%7+1; } int rand10() { int a71,a72,a10; do { a71= rand7()-1; a72 = rand7(); a10 = a71 *7 + a72; } while (a10>= 40); return (a71*7+a72)%10+1;
- 算法导论 5.1-2
- 算法导论 5.1-2
- 算法导论 5.1-2
- 算法导论5.1-2
- 算法导论exercise 5.1-2,5.1-3
- 随机数相关(算法导论5.1.2)
- 算法导论 5.1-3
- 算法导论 5.1-1
- 算法导论 5.1-3
- 算法导论 5.1-3
- 算法导论5.1-3
- 算法导论 2-2
- 算法导论学习2
- 算法导论 24-2
- 算法导论5.4-2
- 算法导论5.4-2
- 算法导论读书笔记2
- 算法导论22.4-2
- C/C++ 各种计时函数总结
- 游戏开发新手入门之位图化图形
- Hamming Codes 海明码
- 禁止后退键
- 同义词
- 算法导论 5.1-2
- 编程技术面试的五大要点
- 把DataTable导出到Excel
- 启动oracle server
- 客户端将手机号发送给服务器,服务器将包含该手机号文件名发送给客户端
- POJ1050总结 二分+判定
- 简述JQuery,Extjs,YUI,Prototype,Dojo 等JS框架的区别和应用场景
- linux Svn服务安装
- waleda脱壳后