一道题 —— 由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;
}

你可能感兴趣的:(闲得慌)