1. 内容##
讲了knuth书中的几种随机抽样函数
1.1 taocp解决方案###
假设要选m个,总数有n个,有一个可产生任意随机数的函数bigrand().
void knuth(int m, int n)
{
for(int i=0; i<n; i++)
{
if( bigrand()%(n-i) < m )
{
cout<<i<<endl;
m--;
}
}
}
1.2 其他方案###
1.2.1 往空集合插数,集合里的数就是结果###
利用了c++ stl 的set
void stlset(int m, int n)
{
set<int> S;
while( S.size()<m )
S.insert( bigrand()%n );
}
1.2.2 把序列打乱,选中前m个元素###
void genshuf(int m, int n)
{
int *x=new int[n];
for(int i=0; i<n; i++) x[i]=i;
for(int i=0; i<m; i++)
{
int j= randint(i, n-1); //randint(int i, int j)返回[i,j]范围内的随机数
swap(i, j);
}
sort(x, x+m);
}
2. 习题##
9.怎么使最坏情况下生成m次随机数就够了?###
每次迭代都有一个绝对不会已经存在的最大值,如果随机数重复了,就把最大的加进去
#include <iostream>
#include <set>
using namespace std;
void getSet(int m,int n)//在0 -- n-1 中挑选m个 随机数
{
srand(time(NULL));//这个很关键
set<int> S;
for(int i=n-m;i<n;++i)
{
int t=rand()%(i+1); // 0<=t<=i
if(S.find(t) == S.end())
S.insert(t);
else
S.insert(i);
}
set<int>::iterator j;
for(j=S.begin();
j!=S.end();++j)
cout<<*j<<" ";
}
int main()
{
getSet(5,10);
return 0;
}