【编程珠玑】学习笔记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左右。
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左右。
相关文章推荐
- 编程珠玑——第12章,采样问题,学习笔记
- 编程珠玑(2)第十二章学习笔记 取样问题
- 《编程珠玑》第12章 抽样问题笔记 生成m个0~n间的随机数
- iBatis2学习笔记:入参和返回值的问题
- Silverlight学习笔记之Silverlight缓存问题
- linux学习笔记--常见问题解决方法
- jdbc的连接问题-----java数据学习笔记之2
- Atlas学习笔记:使用UpdatePanel控件需注意的问题
- 关于asp.net 2.0 入门学习之“GlobalResources与Callback问题”的笔记
- css权重问题--学习笔记
- Silverlight学习笔记之Silverlight缓存问题
- moss2007学习笔记之三,我又遇到了新问题!!
- [学习笔记]学C#遇到的几个问题
- C++学习笔记(8)——继承中的二义性问题和虚基类
- ASP.NET学习笔记----解决页面中部分验证的问题:validationgroup,爽(20080326)
- 关于asp.net 2.0 入门学习之“GlobalResources与Callback问题”的笔记
- STL学习笔记:用非递归的方法实现汉诺塔问题
- [学习笔记][ASP.NET]发现CuteEditor的一个小问题
- java学习笔记,试用初学者,第二节,关于内存地址分配问题
- JavaWeb技术学习笔记(2)-关于tomcat的几个问题