这是一个采访问题:
给定在[1,5]中生成随机数的函数,我们需要使用此函数生成范围[1,9]中的随机数。 我考虑了很多,但我不能写出一个满足ramdomness的等式。 人们请回答。这可能在将来的某些采访中有所帮助。
答案 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),连接它们并拒绝那些超出目标间隔的结果并重试,直到找到一个内部的数字为止