int rand10() { int i = rand7() - 1; int j = rand7() - 1; int num = 7 * i + j; if(num >= 40) return rand10(); else return num % 10 + 1;
int rand7(); int rand10() { int _t1 = rand7();//表示7^1位 int _t2 = rand7(); int t = _t1 * 7 + _t2; while (t <= 10 || t >= 1) { _t1 = rand7();//表示7^1位 _t2 = rand7(); t = (_t1-1) * 7 + _t2; } return t; }
int rand7(); int rand10() { int _t1 = rand7();//表示7^1位 int _t2 = rand7(); int t = _t1 * 7 + _t2; while (t <= 40 || t >= 1) { _t1 = rand7();//表示7^1位 _t2 = rand7(); t = (_t1-1) * 7 + _t2; } //产生了1~40 return ((t - 1) / 4 + 1); }
等概率的具体做法不外乎插空,删除,取余。首先,
可以由rand7() 产生 0-48 的等概率数,每个数产生的概率都是 1/49;
然后当产生 40 - 48 这几个数时我们重新获取,
这样相当于把 40 - 48 的概率均摊到 0 - 39 上面,
所以不会影响 0 - 39 的等概率产生。然后余10加1即可,代码如下:
int rand7()
{
int f = rand() % 7 + 1;
cout << f << endl;
return f;
}
int rand10()
{
int i = ( rand7() -1 ) * 7 + rand7()- 1; // i 是0-48的等概率数
if ( i >= 40 )
return rand10();
else // 现在 i 是 0 - 39 的等概率数
return i % 10 + 1;
}
int main()
{
srand(time(NULL));
cout << rand10();
return 0;
}