等概率自然就是每个数被选中的概率为:
p=mN
通过 if 条件判断,以及 rand() 随机数产生器,我们可轻易产生这样的概率判断:
float p = m/float(N);
if (rand()/float(RAND_MAX) < p)
{
...
}
在 N≫m 的情况下,我们可实现一种简易版的随机数生成器:
int m, N = 10, 1000;
float p = float(m)/N;
for (int i = 0; i < N; ++i)
if (float(rand())/RAND_MAX < p && --m >= 0)
cout << i << endl;
大名鼎鼎的 Knuth 给出了一种更为优雅的实现:
void knuth(int n, int m)
{
srand((unsigned int)time_t(0));
for (int i = 0; i < n; ++i)
if (rand()%(n-i) < m)
{
cout << i << endl;
--m;
}
}
if (rand()%N < m)
就表示以 m/N 的概率成立;
mN=if (rand() % N < m)