使用给定的随机数生成函数查找随机数生成器

时间:2013-06-19 11:45:13

标签: algorithm random number-theory

这是一个采访问题:

给定在[1,5]中生成随机数的函数,我们需要使用此函数生成范围[1,9]中的随机数。 我考虑了很多,但我不能写出一个满足ramdomness的等式。 人们请回答。这可能在将来的某些采访中有所帮助。

3 个答案:

答案 0 :(得分:7)

改编自“Expand a random range from 1–5 to 1–7

假设rand5()是一个返回1到5范围内的统计随机整数的函数。

int rand9()
{
    int vals[5][5] = {
        { 1, 2, 3, 4, 5 },
        { 6, 7, 8, 9, 1 },
        { 2, 3, 4, 5, 6 },
        { 7, 8, 9, 0, 0 },
        { 0, 0, 0, 0, 0 }
    };

    int result = 0;
    while (result == 0)
    {
        int i = rand5();
        int j = rand5();
        result= vals[i-1][j-1];
    }
    return result;
}

它是如何工作的?想象一下:想象一下在纸上打印出这个双维阵列,将它固定在飞镖板上并随意投掷飞镖。如果您达到非零值,则它是1到9之间的统计随机值,因为有相同数量的非零值可供选择。如果你达到零,只要继续投掷飞镖直到你达到非零。这就是这段代码的作用:i和j索引在飞镖板上随机选择一个位置,如果我们没有得到好的结果,我们就会继续投掷飞镖。

这可以在最坏的情况下永远运行,但统计上最坏的情况永远不会发生。 :)

答案 1 :(得分:2)

int rand9()
{
    int t1,t2,res = 10;
    do {
        t1 = rand5();
        do {
            t2 = rand5();
        }while(t2==5);
        res = t1 + 5* (t2%2);
    }while(res==10);
    return res;
}

现在1到9的概率为1/9。

做出一些解释:

t1的概率为1/5为1到5。

t2也是。但是当t2 == 5时,丢弃。所以t2的概率为1/4为1到4.也就是说,1/2的概率为奇数或偶数,这使得t2% 2的概率为1/2为0比1。

因此,t1 + 5 *(t2%2)的概率为5/10为1至5,并且5/10为6至10。 但是10再次被丢弃,所以剩下的9个数字的概率是1/9。

答案 2 :(得分:0)

您需要使用rejection sampling。也就是说,拒绝不符合目标分布的结果。在您的情况下,您可以使用两个连续调用rand15函数的低三位(如果需要,-1),连接它们并拒绝那些超出目标间隔的结果并重试,直到找到一个内部的数字为止