您的位置:首页 > 其它

算法导论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的哪个值。

代码如下:

#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的值
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: