1.当m < n时比较简单:

只当randn()生成的数落在1-m上时,就输出,否则继续生成;

2.当m > n时就比较麻烦一点,

基本思路还是和第一种情况是一样的,问题是怎样才能利用randn()生成大于n个随机数呢?

randn = n * (randn() - 1) + randn()可以生成1~n之间的数,那么只要想办法生成1-A的数,A >= m,即可,

randn = n * (randn() - 1) + randn();

这样就可以得到randn 生成1-A的数,A = n,

然后再按照第一步的方法即可生成1-m的随机数了!

 //m < n
int randm() {
int x = randn();
while (x > m) {
x = randn();
}
return x;
} // m > n
int A;
int getK() {
A = n;
int k = ;
while (A < m) {
A *= n;
++k;
}
return k;
}
int randA(int k) {
if (k == )
return randn();
return n * (randA(k - ) - ) + randA(k - );
}
int randm() {
x = randA();
while (x > m * (A / m))
x = randA();
return x % m + ;
}
05-11 16:01