首页 > 试题广场 >

给定一个能够生成0,1两个数的等概率随机数生成器”,如何生成

[问答题]
给定一个能够生成0,1两个数的等概率随机数生成器”,如何生成⼀个产生0,1,2,3的等概率随机数生成器?
和上题类似,如何用rand7生成rand9?
将两个0,1随机生成器级联,每次产生两个数,则可能的结果有(0,0), (0,1), (1,0), (1,1),分别映 射到0, 1, 2, 3即可
两个rand7可以产生49种可能,扔掉后面的4种,保留前45个,并平均分成9份,每次产生一个结果时,假如没落在对应区间中就扔掉,否则根据落在哪个区间判断是0--8中哪个
发表于 2015-05-05 14:41:18 回复(0)
int rand0_3()
{
    return rand0_1()+rand0_1();
}

int rand9()
{
    int n=0;
    do{
        n=(rand()7-1)*7+rand()7;
    }while(n>45)
    return n%9+1;
}

编辑于 2015-06-12 09:13:23 回复(1)

intrand0_3()
{
    returnrand0_1()+rand0_1();
}
 
intrand9()
{
    intn=0;
    do{
       n=(rand()7-1)*7+rand()7;
    }while(n>45)
    returnn%9+1;
}
发表于 2020-03-30 15:51:20 回复(0)
答案前面的人已经说了,这里给出代码
int res = 0, bits = ceil(log(n)/log(2.0));
for(int i = 0; i < bits; i++){
    if(rand01() == 1)
        res |= (1 << i);
}
if(res < n)
    return res;


发表于 2020-03-16 17:21:27 回复(0)
将两个0,1随机生成器级联,每次产生两个数,则可能的结果有(0,0), (0,1), (1,0), (1,1),分别映 射到0,
  1, 2, 3即可
  两个rand7可以产生49种可能,扔掉后面的4种,保留前45个,并平均分成9份,每次产生一个结果时,假如没落在对应区间中就扔掉,反之为1~9中的一个数
发表于 2015-07-11 11:18:28 回复(0)