已有方法rand7
可生成1到7范围内的均匀随机数,试写一个方法rand10
生成1到10范围内的均匀随机整数。
假设randN()
能等概率的生成[1, N]
范围内的所记述,则(randX() - 1)*Y + randY()
能等概率地生成[1, X*Y]
范围内的随即数。例如,假设rand2
能生成[1,2]
范围内地随机数,rand3
能生成[1,3]
范围内的随机数,则(rand2() - 1) * 3 + rand3()
能生成[1,6]
范围的随机数。
- 通过
(rand7() - 1) * 7 + rand7()
生成[1,49]
的随机数 - 如果能生成
[1, 50]
之间的随机数num
,则我们使用num % 10 + 1
就可以生成[1,10]
之间的随机数,也就是rand10()
,但只能生成[1,49]
的随机数,这种情况下可以使用拒绝采用,也就是某个数字不符合条件就丢弃它,在这个问题中只有num
在[1,40]
之间时,我们才生成num % 10 + 1
作为[1, 10]
之间的随机数。如果num
不在[1,40]
之间,就继续生成num
,直到[1,40]
之间。
class Solution{
public:
int rand10()
{
while(true)
{
int num = (rand7() - 1) * 7 + rand7();
if(num <= 40)
return num % 10 + 1;
}
}
};