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;
}