算法导论5.1-2

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的哪个值。

 

代码如下:

 1 #include <iostream>
 2 #include <time.h>
 3 using namespace std;
 4 
 5 int get01rand();
 6 int getabrand(int a,int b);
 7 int value[100];
 8 
 9 void main(){
10     srand((unsigned int)(time(NULL)));
11     int a,b;
12     cin >>a >> b;
13     cout << getabrand(a,b);
14 }
15 
16 int get01rand(){
17     return rand()%2;//(取值是K,那么生成的随机数就是0 ~ K-1)
18 }
19 
20 int getabrand(int a,int b){
21 
22     int k = b - a + 1;
23 
24     // 用get01rand函数生成对应k位2进制数,其值一定在0 ~ 2^k-1之间,
25     // 然后把其均分为k等分,分别对应到a,a+1,...,b.
26     int he = 0;
27     int lo = 1;
28 
29     for(int p = 0;p<k;p++) // 得到k位2进制数
30         lo = lo*2;
31     int max = lo;
32 
33     for(int i=0;i<k;i++)
34     {
35         if(get01rand() !=0){  //计算随机生成的数
36             lo = 1;
37             for(int j=0;j<i;j++)
38                 lo=lo*2;
39             he = he + lo;
40         }
41     }
42     int deng = max/k;
43     if(he/k > deng) //如果不在对应的分段范围内,则重新分配
44         getabrand(a,b);
45 
46     return he/deng+a; //否则,返回对应分段的 b - a + 1的值
47 }

转载于:https://www.cnblogs.com/xuxu8511/archive/2012/08/15/2640165.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值