您的位置:首页 > 其它

随机数生成器

2015-09-06 10:38 148 查看

题目一:已知rand7()可以产生1~7的7个数(均匀概率),利用rand7() 产 生 rand10() 1~10(均匀概率)。

int rand10(){

int temp1,temp2;
do{
temp1=rand7();
}while(temp1>5);//产生1~5
do{
temp2=rand7();
}while(temp2>2);//产生1~2
return temp1+5*(temp2-1);
}
分析:rand7产生的数概率是一样的,即1~7出现的概率一样,由于对结果做了筛选只能产生1~5,并且其概率也是一样的,所以temp1出现1~5的概率为1/5,同理temp 1~2的概率为1/2.
1)temp1出现1~5的概率为1/5,temp2 1~2的概率为1/2,则5*(temp2-1)出现0,5的概率为1/2,所以如果要得到1~5的数,则5*(temp2-1)必须为0,所以num的概率为:1/2*1/5=1/10同理得到大于5时候的数的概率也是1/10
思路二:

int rand10()

{

    int x=0;

    do{

        x=(rand7()-1)*7+rand7();

    } while(x>40);

    return x%10+1;

}

解释:

 x=(rand7()-1)*7+rand7();

这里的x范围是1到49,等概率产生的,都是1/49

1到49之间有1到10,11到20,21到30,31到40,只要%10然后+1,就是等概率的1到10,但是41到49,不够1到10,其实while(x>20);while(x>30);都是对的,就是效率差了点。

另一个观点就是把x=(rand7()-1)*7+rand7() 看成2位的7进制数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: