摘自:http://www.cnblogs.com/chengy024/archive/2008/07/01/1233075.html
今天,看到c++编程思想中模板一章,发现书中给出的随机数发生器类用一种很简单,易理解的方式,展示了无重复随机数的产生。而且,此类相当容易扩展,生成自己所需要的各类随机数,所以记录下来,以后可以方便复习。
下面是作者写的随机数发生器类:
template
<
size_t N
=
100
>
class Generator {
private:
bitset<N> v;
public:
Generator()
{
srand((unsigned int)time(NULL));
}
int operator()()
{
int val;
if (v.count() == N)
{
v.reset();
}
while (v[val = rand()%N])
{
}
v[val] = 1;
return val;
}
} ;
class Generator {
private:
bitset<N> v;
public:
Generator()
{
srand((unsigned int)time(NULL));
}
int operator()()
{
int val;
if (v.count() == N)
{
v.reset();
}
while (v[val = rand()%N])
{
}
v[val] = 1;
return val;
}
} ;
其主要思想是:应用bitset容器存储N位,N是要产生的随机数上限,默认设为100。在构造函数中,种下随机数种子。利用()操作符,产生随机数。每产生一个随机数,将bitset容器中相应的位设为1。如果产生的随机数对应的位已设定,则说明此随机数以产生过,则利用while循环,继续产生,直到产生未使用过的随机数。
此类易于改变,可以使其适合大多数需要随机数的场合。下面做个简单扩展,让其产生[MIN,MAX)之间的无重复随机数。
template
<
size_t MIN
=
0
,size_t MAX
=
100
>
class Generator {
private:
bitset<MAX-MIN> v;
public:
Generator()
{
srand((unsigned int)time(NULL));
}
int operator()()
{
int val;
if (v.count() == MAX-MIN)
{
v.reset();
}
while (v[val = rand()%(MAX-MIN)])
{
}
v[val] = 1;
return val+MIN;
}
} ;
class Generator {
private:
bitset<MAX-MIN> v;
public:
Generator()
{
srand((unsigned int)time(NULL));
}
int operator()()
{
int val;
if (v.count() == MAX-MIN)
{
v.reset();
}
while (v[val = rand()%(MAX-MIN)])
{
}
v[val] = 1;
return val+MIN;
}
} ;
下面是调用方式:
int
main()
{
Generator<10,50> ger;
int c;
for (int i=0; i<20; i++)//产生20个10到50之间的随机数
{
c = ger();
cout<<c<<"/t";
}
return 0;
}
应包含的头文件:
#include <bitset>,#include <iostream>,#include <ctime>,并使用std命名空间。
{
Generator<10,50> ger;
int c;
for (int i=0; i<20; i++)//产生20个10到50之间的随机数
{
c = ger();
cout<<c<<"/t";
}
return 0;
}