470用 Rand7() 实现 Rand10()
1、题目描述
给定方法 rand7
可生成 [1,7]
范围内的均匀随机整数,试写一个方法 rand10
生成 [1,10]
范围内的均匀随机整数。
你只能调用 rand7()
且不能调用其他方法。请不要使用系统的 Math.random()
方法。
每个测试用例将有一个内部参数 n
,即你实现的函数 rand10()
在测试时将被调用的次数。请注意,这不是传递给 rand10()
的参数。
2、示例
示例 1:
输入: 1 输出: [2]
示例 2:
输入: 2 输出: [2,8]
示例 3:
输入: 3 输出: [3,8,10]
3、题解
两次rand7分别构造1/2和1/5的概率即可,古典概型。
1. 第一次rand7限定[1,6],判断奇偶性,概率是1/2
2. 第二次rand7限定[1,5],概率是1/5
3. 二者结合可以得出10种概率相同的结果
预期采样次数=7/6+7/5 = 2.56
扩展:rand7() 构造任意范围的随机数发生器
- rand11() :
构造 2 次采样,分别有 2 和 6 种结果,组合起来便有 12 种概率相同的结果。
把这 12 种结果映射到 [1,12] ,然后再拒绝 12 即可。
- rand100() :
构造 3 次采样,分别有 4,5,5 种结果,组合起来便有 100 种概率相同的结果。
把这 100 种结果映射到 [1,100] 即可。
#include<iostream>
#include<vector>
#include<cstdlib>
using namespace std;
class Solution {
public:int rand10() {int first, second;while ((first = rand7()) > 6);while ((second = rand7()) > 5);return (first&1) == 1 ? second : 5+second;}
private:int rand7() {return rand()%7+1;}
};
int main()
{Solution so;cout<<so.rand10()<<endl;return 0;
}