这是一个面试题:
给定一个函数,该函数在[1,5]范围内生成随机数,我们需要使用该函数来生成一个在[1,9]范围内的随机数。 我思考了很多,但无法写出满足随机性要求的方程。 希望有人能回答。也许在今后的面试中会有所帮助。
这是一个面试题:
给定一个函数,该函数在[1,5]范围内生成随机数,我们需要使用该函数来生成一个在[1,9]范围内的随机数。 我思考了很多,但无法写出满足随机性要求的方程。 希望有人能回答。也许在今后的面试中会有所帮助。
源自"将1-5的随机数扩展为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;
}
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。也就是说,t2%2有1/2的概率是0到1,即有1/2的概率是奇数或偶数。
因此,t1 + 5*(t2%2)有5/10的概率是1到5,另外5/10的概率是6到10。但是10再次被丢弃,所以剩下的9个数字的概率是1/9。
rand15
函数的低三位(如果必要,减去1),将它们连接起来,并拒绝那些超出你目标区间的结果,重试直到找到一个在范围内的数字。