下面的程序可以从0....n-1中随机等概率的输出m个不重复的数。这里我们假设n远大于m
1
2
3
4
5
6
7
8
9
10
|
knuth(
int
n,
int
m)
{
srand((unsigned
int
)time(
0
));
for
(
int
i =
0
; i < n; i++) {
if
(rand()%(n-i)<m ) {
cout << i << endl;
m--
;
}
}
}
|
解释如下:
对于从0到n-1 个数字想要等概率输出,说明每个数字出现的概率为m/n
对于i=0,rand()%(n-0) <m 的概率为 m/ n;
对于任意的i ,rand()/n-i <m 的概率都是 m/n;
以下以i=1 举例:
假如 i= 0 输出了,概率为m/n,此时 m 变成m-1;rand() %(n-1) <m 的概率变成m-1/n-1
假如i=0 没有输出,概率为n-m/n rand()%(n-1)<m 的概率为m/n-1
通过概率公式可以算出来概率是m/n。
后面道理是一样的。