您的位置:首页 > 编程语言

【编程珠玑】学习笔记5——抽样问题

2014-09-01 08:00 204 查看
前言:C库中的rand()函数大概随机返回15个随机位的整数,可以在该方法的基础上生成至少30个随机位的整数,并实现返回一个(l-u)之间的随机数的函数randint(l,u)。

bigrand()函数(生成至少30个随机位的整数)

int bigrand()

{

return ( rand()*RAND_MAX + rand() );

}

备注:常量 RAND_MAX 是可以由rand 函数返回的最大值。
RAND_MAX 的定义在stdlib.h中,值为 0x7fff。

int randint(int m, int n)

{

return ( m + rand()%(n-m+1) );

}

在生成随机数的过程中,为了保证统一线程中每次生成的随机数不一样,需要引入srand函数生成随机数种子,srand函数原型为:

void srand( unsigned int seed );

seed表示伪随机数种子,可以为getpid()或者time(0)的返回值。

下面是生成 m 个0 - n-1之间不重复且有序的随机数的方法

void genknuth(int m,int n)

{

for(int i=0;i<n;i++)

{

//select m of remaining (n-i)

if((bigrand()%(n-i)) < m)

{

cout << i <<" ";

m--;

}

}

}

void gensets(int m,int n)

{

set<int> S;

while(S.size() < m)

{

S.insert(bigrand() % n);

}

set<int>::iterator it;

for(it = S.begin();it != S.end(); it++)

{

cout <<*it<<" ";

}

}

void genshuf(int m,int n,ofstream &out)

{

int i,j;

int *x = new int
; //生成0-n-1的n个数

for(i=0;i<n;i++)

{

x[i] = i;

}

for(i=0;i<m;i++)

{

j = randint(i,n-1); //打乱顺序后选取前m个值

int tmp;

tmp = x[i];

x[i] = x[j];

x[j] = tmp;

}

sort(x,x+m); //再对前m个数排序

for(i = 0;i<m;i++)

{

out << x[i]<<" ";

}

}

我在自己的机子上测了一下用上述3种方法生成1-2000000之间不重复的1000000个随机数,用时基本相同,在9s左右。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: