一道题 —— 由rand5()实现rand7()

编程题目:已知有一个函数rand()可以生成1~5之间的整数随机数,其结果每个数的概率均匀分布,尝试写出一个可以生成1~7之间的整数随机数的函数,且每个数均匀分布。

解法:题目需要一个能够获得1~7之间整数的函数,并且得到每个数的概率都是严格的1/7。
如果只是得到1-7的话很简单,例如 (rand() + rand() % 3),但这样的话,每个数的概率不同,例如7只能由5+2一种组合得到,概率是1/25,而4可以由2+2、3+1和4+0三种组合得到,概率是3/25。顺着这个思路,我们需要想一个公式或算法,让每个数出现的概率相同。
下面是我给出的解法:

int getRandom1_5()
{
    int radomNum;

    //srand((unsigned int)time(0));//每次调用这个就完全不随机了~
    radomNum = rand() % 5 + 1;

    return radomNum;
}

int main()
{
    /* 由生成1-5随机数的函数来生成1-7随机数 */
    int numCount[7] = {0};
    int radomNum;
    int i;

    srand((unsigned int)time(NULL)); //以时间为种子,time()精确到s
    for (i = 0; i < 10000; i++)
    {
reCul:
        //关键在获得每个数的次数(概率)相等。即每个数只能由一种组合得到
        radomNum = 5 * (getRandom1_5() - 1) + getRandom1_5();
        if (radomNum > 7)
        {
            goto reCul;//范围之外就抛弃此次结果重新来一遍
        }
        numCount[radomNum - 1]++;
        //usleep(200);
    }

    for (i = 0; i < 7; i++)
    {
        printf("%d: %d\n", i + 1, numCount[i]);
        //cout << i + 1 << radomNum[i] << endl;
    }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值