算法思路借鉴于官方题解,添加了详细注释用于理解,刷题打卡
拒绝采样法(无优化)-存在最坏情况时间复杂度O(∞)(一直被拒绝)
class Solution
{
public:
int rand10()
{ //拒绝采样思路,目的就是构造等概率有规律的40个数字
while (1)
{
int a = rand7(), b = rand7(), res;
res = (a - 1) * 7 + b; //产生1-49范围内等概率所有整数
if (res <= 40)
return (res) % 10 + 1; //res处于1-40范围内时可用,处于41-49时拒绝使用,重新取样
}
}
};
拒绝采样法(添加优化)-大概率避免了一直被拒绝的情况(实际上存在一直取到最后一种情况的21,但概率极低)
class Solution
{
public:
int rand10()
{
/*拒绝采样法的优化,思路为将拒绝的数字利用起来重新产生连续递增的整数,取其中10的最大整数倍个数字作为有效数字
无效数字继续用于产生连续递增的整数,若最后只剩1则无法达到生成数据的目的,需重新开始整个循环*/
while (1)
{
int a = rand7(), b = rand7(), res;
res = (a - 1) * 7 + b;
if (res <= 40)
return (res) % 10 + 1;
res = (res - 40 - 1) * 7 + rand7(); //利用41-49生成1-63,取1-60有效
if (res <= 60)
return (res) % 10 + 1;
res = (res - 60 - 1) * 7 + rand7(); //利用61-63生成1-21,取1-20有效
if (res <= 20)
return (res) % 10 + 1;
//仅剩21时无法继续生成,重新进入循环
}
}
};