标签:实习-阿里-笔试题
计算机使用的随机数生成器往往是伪随机的,为了达到统计意义上的真随机数,可以需要引入系统
外的变量等作为随机种子(如UNIX系统中熵池)。假设有一天出现了上帝的投硬币函数: int G();
由于这里用到的上帝硬币可能不均匀。但可以保证是G()可以x概率返回1,1-x的概率返回0,其中x为未知常数(且x不等于0或1)。
请实现目标函数: int F(double p);
要求
基于前述类似思路,请构造函数求下述无理数近似值:
提示:作为模拟过程,可引入最高重复试验次数,请简述思路并完成代码。
思路:
0 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 |
---|
可以用十进制331表示,所有可能的十进制都在[0, 1024)范围里。所以只要生成的十进制数小于1024*p就返回1,大于就返回0,这样就可满足要求。
#include <stdlib.h>
#include <iostream>
using namespace std;
int F(double p)
{
int sum = 0;
int t = 10;
int all = 1024;
int t1 = all * p;
for (int i = 0; i < t; ++i)
sum += U()<<i;
if (sum < t1)
return 1;
else if (sum >= t1)
return 0;
}
// generate the uniform random function
// reference book: <<algorithm introduction>>
int U()
{
int n1 = -1, n2 = -1;
do{
n1 = G();
n2 = G();
if (n1 == 0 && n2 == 1)
return 1;
else if (n1 = 1 && n2 == 0)
return 0;
}while((n1 == 0 && n2 == 0) || (n1 == 1 && n2 == 1))
exit(-1);
}
标签:实习-阿里-笔试题
原文地址:http://blog.csdn.net/anycodes/article/details/44837911