分情况讨论:
1. m <= n时
取rand() < m的数即可,大于m的舍弃,这样因为每个数产生的概率相同,解空间为1,那么每个数产生的概率就是1/m。
2. m > n时
按照1的思路,需要扩大能随机到数的空间,大于m即可,采用的办法是k*n + s。k = 0,1,2....m/n,s = 0,1,2....n-1。这样解空间就为(m/n + 1)* n,取小于m的数即可。
代码如下:
int rand(int m)
{
int res;
if ( m <= n)
{
while ( (res = rand()) >= m );
return res;
}
int K = m / n;
int x = rand(K+1);
int y = rand();
while ((res = ( x * n + y )) >= m)
{
y = rand();
}
}