2016阿里实习线上笔试题-附加题1-随机数生成器

随机数生成器

计算机使用的随机数生成器往往是伪随机的,为了达到统计意义上的真随机数,可以需要引入系统
外的变量等作为随机种子(如UNIX系统中熵池)。假设有一天出现了上帝的投硬币函数: int G();
由于这里用到的上帝硬币可能不均匀。但可以保证是G()可以x概率返回1,1-x的概率返回0,其中x为未知常数(且x不等于0或1)。

请实现目标函数: int F(double p);
要求

    1. F函数以概率p返回1,以1-p返回0。
    1. 除了G之外,不使用的任何库函数。 PS:定义宏UINT_MAX=0xffffffff

基于前述类似思路,请构造函数求下述无理数近似值:

    1. double pi(); //圆周率π
    1. double e(); // 自然对数函数的底数e。

提示:作为模拟过程,可引入最高重复试验次数,请简述思路并完成代码。

思路:
1. 构造p概率随机数生成函数

  • 由G()生成等概率随机数生成函数,可参考算法导论或这篇博客
  • 由等概随机函数进行多次数(例如10次)随机,那么就会产生1024种结果,而且每种结构都等概。那么我们可以分析每种随机结果,每种随机结果可以用十进制表示,
0101001011

可以用十进制331表示,所有可能的十进制都在[0, 1024)范围里。所以只要生成的十进制数小于1024*p就返回1,大于就返回0,这样就可满足要求。

2. pi和e生成方法
π=4(1113+1517...)
e=10!+11!+12!+...+1n!...
这种方法不知道是不是满足出题人的意思呢?这一部分的代码就不贴上来了。

#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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值