假设有一个rand(0,1)的0,1随机生成器,如何对于给定的(a,b),随机生成一个x, 其中 a <= x <= b
2006-08-28 18:37
453 查看
Describe an implementation of the procedure RANDOM(a, b) that only makes calls to RANDOM(0, 1). What is the expected running time of your procedure, as a function of a and b?
这是算法导论中随机算法部分的一道题,看似很简单,我却花了好几天才想出一个比较流氓的答案。
后悔当初学数学的时候不好好学概率啊。
#define RAND_0_OR_1 ( rand()&1 )
int rand_t(int a, int b){
if( a > b) return rand_t( b, a );
int max = ( a - b > 0 ) ? ( a - b ) : ( b - a );
int i;
int nRes = max + 1;
while( nRes > max )
{
nRes = 0;
i = 1;
while( i < max + 1 )
{
i <<= 1;
nRes += RAND_0_OR_1;
nRes <<= 1;
}
nRes >>= 1;
}
return a + nRes;
}
基本的原理是:
先把一般的情况化为(0, b - a), 之后令max = b - a, 生成从0 到 2^k - 1的一个随机数nRes,其中
2^(k-1) - 1 <= max < 2^k - 1, 如果nRes大于max,则重新生成直到nRex <= max为止。这个循环会在非常有
限的次数内结束,因为进行10次以上的概率 < 1 / (2^10)。(具体原理请参照概率论的初步知识)
在生成的结果中,每个在0 ~ max之间的数目出现的概率为 1 / 2^k。
这里我使用了C标准库的随机数函数来取得随机的0和1。
其实这个算法算是比较流氓的。大家如果有有更好的算法,请联系并告诉我,小弟将不胜感激。
这是算法导论中随机算法部分的一道题,看似很简单,我却花了好几天才想出一个比较流氓的答案。
后悔当初学数学的时候不好好学概率啊。
#define RAND_0_OR_1 ( rand()&1 )
int rand_t(int a, int b){
if( a > b) return rand_t( b, a );
int max = ( a - b > 0 ) ? ( a - b ) : ( b - a );
int i;
int nRes = max + 1;
while( nRes > max )
{
nRes = 0;
i = 1;
while( i < max + 1 )
{
i <<= 1;
nRes += RAND_0_OR_1;
nRes <<= 1;
}
nRes >>= 1;
}
return a + nRes;
}
基本的原理是:
先把一般的情况化为(0, b - a), 之后令max = b - a, 生成从0 到 2^k - 1的一个随机数nRes,其中
2^(k-1) - 1 <= max < 2^k - 1, 如果nRes大于max,则重新生成直到nRex <= max为止。这个循环会在非常有
限的次数内结束,因为进行10次以上的概率 < 1 / (2^10)。(具体原理请参照概率论的初步知识)
在生成的结果中,每个在0 ~ max之间的数目出现的概率为 1 / 2^k。
这里我使用了C标准库的随机数函数来取得随机的0和1。
其实这个算法算是比较流氓的。大家如果有有更好的算法,请联系并告诉我,小弟将不胜感激。
相关文章推荐
- 在0~N(不包括N)范围内随机生成一个长度为M(M <= N)且内容不重复的数组
- 谷歌面试题:给定一个数据流,其中包含无穷尽的搜索关键字(比如,人们在谷歌搜索时不断输入的关键字) 。如何才能从这个无穷尽的流中随机的选取 1000 个关键字?
- 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从
- 如何设计一个高效算法从N个正整数中,随机选取n个不同的随机数 n<=N
- 随机生成[0,n)(n<=RAND_MAX)的数
- 如何成为一个游戏制作人——第四章:面向对象编程语法(详细请自学<<C++ Primer>>)
- 对于 std::vector<T> , 当T没有赋值运算符函数的时候,如何调用vector push_back?
- 给定一个函数rand5(),使函数rand7()可以随机等概率的生成1-7的整数
- 给一个生成0-a的随机整数的函数,如何生成0-b的随机整数? (a,b都是正整数且之间没有关系)
- 转:在0~N(不包括N)范围内随机生成一个长度为M(M <= N)且内容不重复的数组
- <仅是自己做笔记。。。系列-14>输入两个整数序列。其中一个序列表示栈的push顺序, 判断另一个序列有没有可能是对应的pop顺序。
- 给出N个正整数,其中只有一个数出现了奇数次,其余的数都出现偶数次。求那个出现了奇数次的数。1<=N<=1000,N肯定是奇数。所有出现的整数都不超过1000。
- 已知某公司总人数为W,平均年龄为Y岁(每年3月末计算,同时每年3月初入职新人),假设每年离职率为x,x>0&&x<1,每年保持所有员工总数不变进行招聘,新员工平均年龄21岁。 从今年3月末开始,请实现一个算法,可以计算出第N年后公司员工的平均年龄。(最后结果向上取整)。
- <一>Ioc控制反转——手把手教学:如何配置并使用单元测试一个spring框架(附源码)
- 请写出一个程序,对于一个m行,m列的(1<m<10)的方阵,求其每一行,每一列及 主对角线元素之和,最后按照从大到小的顺序依次输出
- 设M 是一个m×n 的矩阵,其中每行的元素从左到右单增有序,每列的元素从上到下单增有序。 给出一个分治算法计算出给定元素x 在M 中的位置或者表明x 不在M 中。分析算法的时间复杂性。
- 对于给定的一个字符串,统计其中数字字符出现的次数。输入数据有多行,第一行是一个整数n,表示测试实例的个数,后面跟着n行,每行包括一个由字母和数字组成的字符串。
- 在JSP中动态生成随机验证码,登录时后台校验验证码,以及如何避免同一个验证码被重复提交爆破密码
- 如何生成任意给定区间的随机值序列
- subsets之给定一个数列&生成该数列所有的子集&升序