算法导论5.1-2
2012-08-15 15:28
393 查看
http://hi.baidu.com/mianshiti/blog/item/416d8ed07cef6e3a960a1611.html 【一个类似问题的面试题链接】
思想:
用RANDOM(0,1)生成随机的k = b-a+1位2进制随机数,即:value = n1,n2,n3,...nk.
那么,其值等于:value = n1*2^0+n2*2^1+....nk*2^k.
分析知道,value的值在0到2^k-1之间,那么我们做这样的设计,把0到2*k-1等分为k分,分别对应到a,a+1,...,b-a+1。
得到的随机数value落在k分的哪段就是a,a+1,...,b-a+1的哪个值。
代码如下:
思想:
用RANDOM(0,1)生成随机的k = b-a+1位2进制随机数,即:value = n1,n2,n3,...nk.
那么,其值等于:value = n1*2^0+n2*2^1+....nk*2^k.
分析知道,value的值在0到2^k-1之间,那么我们做这样的设计,把0到2*k-1等分为k分,分别对应到a,a+1,...,b-a+1。
得到的随机数value落在k分的哪段就是a,a+1,...,b-a+1的哪个值。
代码如下:
#include <iostream> #include <time.h> using namespace std; int get01rand(); int getabrand(int a,int b); int value[100]; void main(){ srand((unsigned int)(time(NULL))); int a,b; cin >>a >> b; cout << getabrand(a,b); } int get01rand(){ return rand()%2;//(取值是K,那么生成的随机数就是0 ~ K-1) } int getabrand(int a,int b){ int k = b - a + 1; // 用get01rand函数生成对应k位2进制数,其值一定在0 ~ 2^k-1之间, // 然后把其均分为k等分,分别对应到a,a+1,...,b. int he = 0; int lo = 1; for(int p = 0;p<k;p++) // 得到k位2进制数 lo = lo*2; int max = lo; for(int i=0;i<k;i++) { if(get01rand() !=0){ //计算随机生成的数 lo = 1; for(int j=0;j<i;j++) lo=lo*2; he = he + lo; } } int deng = max/k; if(he/k > deng) //如果不在对应的分段范围内,则重新分配 getabrand(a,b); return he/deng+a; //否则,返回对应分段的 b - a + 1的值 }