产生随机数

  摘自: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;
    }

}
;

    其主要思想是:应用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命名空间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值