美文网首页
chapter 12

chapter 12

作者: yangqi916 | 来源:发表于2016-09-22 22:00 被阅读0次

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

相关文章

网友评论

      本文标题:chapter 12

      本文链接:https://www.haomeiwen.com/subject/vozzettx.html