在最近的一次采访中,我遇到了以下问题
给定一个随机返回0或1的函数BinaryRandom((,创建一个函数int MyRandom(int(,它创建一个小于或等于使用BinaryRandom((的给定输入。
由于我是GeeksForGeeks的每日堆栈溢出用户,我记得GeeksFerGeeks上也有类似的问题,请参阅下面的链接
https://www.geeksforgeeks.org/implement-random-0-6-generator-using-the-given-random-0-1-generator/
唯一的区别是GeeksForGeeks的范围是0-6,在我的情况下范围是<N(N为输入整数(。
并且上述解决方案是使用以下链接从SO导出的
通过掷硬币创建一个随机数生成器。
作为算法的初学者,我发现上面的内容很难理解。有人能为上述问题提出一个简单的解决方案吗?还是简单地理解一下?
给定一个返回0或1的函数BinaryRandom((
创建一个函数intMyRandom(int)
,该函数创建一个小于或等于给定输入的随机数
int MyRandom(int max);
查找
max
->bitwidth
。也许计算右移直到0。例如,对于max == 42
,我们需要6个比特。调用
BinaryRandom()
形成随机数。例如,具有6个比特,这将形成数字[0...63]
。int r = 0; // Double the value each iteration and add new bit. for (i = 0; i<bitwidth; i++) r = 2*r + BinaryRandom();
确保不超出范围:如果
r > max
,重复步骤2。返回
r
。
有一些方法(未显示(可以减少必须重做步骤2的机会,但我们希望通过执行类似r_from_more_than_6_iterations%42
的操作来避免对结果产生偏差。
基于chux的答案,这里有一个简单的实现:
int MyRandom(int max) {
for (;;) {
int r = 0;
for (m = max; m > 0; m >>= 1) {
r += r + BinaryRandom();
}
if (r <= max || max < 0)
return r;
}
}