无语
勤奋,踏实,在生活中学习,在学习中快乐……
     今天,看到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;
    }

}
;

    其主要思想是:应用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;
    }

}
;
    
  下面是调用方式:
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命名空间。
posted on 2008-07-01 12:34  程、诚、成  阅读(478)  评论(0编辑  收藏  举报