问题
已有方法 rand7() 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 10 范围内的均匀随机整数。
不要使用系统的 Math.random() 方法。
例子

思路
最开始向让1到7直接映射到1到10,但没法实现
考虑把1到7映射到更大,囊括1到10,然后缩小。
单纯的加法不可以,因为向5有两种组合3+2,1+4,3只有一种1+2
使用[rand7()−1]∗7+rand7()[rand7()-1]*7+rand7()[rand7()−1]∗7+rand7()
(0~6)*7+17->149每个数都是等比例
如果得到>40则重新获取,否则num%10+1【n%10+1=0~9 +1=1~10]

-
方法1
$$$$
-
方法2
$$$$
代码
//方法1
class Solution extends SolBase {
public int rand10() {
int a = (rand7()-1)*7+rand7();
while(a>10)
a = (rand7()-1)*7+rand7();
return a;
}
}
//方法2
class Solution extends SolBase {
public int rand10() {
int a = (rand7()-1)*7+rand7();
while(a>40)
a = (rand7()-1)*7+rand7();
return a%10+1;
}
}

本文介绍了一种基于已有rand7()函数生成1到10范围内均匀随机整数的方法。通过将1到7映射到更大的范围, 然后筛选出1到40之间的数, 最终通过取余数加1来生成1到10的随机数。这种方法避免了直接使用Math.random()函数。
360

被折叠的 条评论
为什么被折叠?



