zoukankan      html  css  js  c++  java
  • boost 随机数发生器

    Random     随机数

    在很多应用中都需要使用随机数。本库力求提供一个高效的,通用的随机数库。boost库有多种随机数生成方式。先熟悉一下各种随机数生成器的概念。

    数字生成器(Number Generator

    它是一个函数对象,没有参数。类似于常见的rand( )

    均匀随机数生成器(Uniform Random Number Generator

    在一个范围内生成随机数,有强下界和强上界。一个例外是对于小数没有强上界,即v.min() <= x < v.max(),这主要是为了考虑形如[0,1)这类随机数。

    不确定均匀随机数生成器(Non-deterministric Uniform Random Number Generator

    原话是:一个不确定均匀随机数生成器是一个 UniformRandomNumberGenerator,它基于某种随机过程,因此能提供真正随机的的随机数序列。随机过程包括原子核衰变、Zehner 二极管的噪音、量子隧道效应、投掷骰子、罐中取物、投掷硬币等等。网络数据包到达的间隔、键盘事件有时也可以被看作随机过程。 从这段话来看,这个模型是最先进的,不知道有没有实现。

    伪随机数生成器(Pseudo-random Number Generator

    这是一种Uniform Random Number Generator,使用了某些线性算法。通常需要提供seed

    随机分布(Random Distrubution

    随机分布取均匀分布的随机值作为输入,输出符合某一分布的随机数。

    头文件 <boost/random.hpp>

    variate_generator 类模板

    变种生成器用来组合随机数生成器和随机分布。关于生成器和分布,boost库提供了很多现成的。

    概要:
    template<class Engine, class Distribution>
    class variate_generator
    {
    public:
    typedef Engine engine_type;
    typedef Distribution distribution_type;
    typedef typename Distribution::result_type result_type;

    variate_generator(Engine e, Distribution d);

    result_type operator()();
    template<class T>
    result_type operator()(T value);

    engine_value_type& engine();
    const engine_value_type& engine() const;

    result_type min() const;
    result_type max() const;
    };

    比较迷惑人的是两个operator( )

    生成器

    看到库后,发现有太多的生成器。每种生成器有不同的性质,内存要求,速度等。做为一个非专业人士,我不知道如何选择。库的说明文档中指出,如果不清楚如何选择,就使用mt19937,好吧,我就用mt19937了。

    这里所有的生成器都是,typedef 进行专门化来给出的,封装在 boost::random 名字空间中。例如:

    typedef random::mersenne_twister< > mt19937;

    用法:

            boost::variate_generator<boost::mt19937, boost::uniform_real<> > vgen (boost::mt19937(),boost::uniform_real<>(0, 1)); //生成 [0, 1)的随机数

    for(int i = 0; i < 10; i++)              cout<< vgen( );

    分布

    讲到分布,这个数学知识就更深了。我从手册上copy一份表格吧.

    分布

    描述

    实例

    uniform_smallint

    在小整数集 (远小于内部生成器的值域) 上的离散均匀分布

    罐中取物

    uniform_int

    在整数集上的离散均匀分布;可能会多次调用内部生成器以获得足够多的随机性

    罐中取物

    uniform_01

    区间 [0,1) 上的连续均匀分布;此分布是其它分布的重要基础

    -

    uniform_real

    实数区间 [min, max) 上的连续均匀分布

    随机投下一木棍,其偏转角的弧度数是 [0, 2pi) 上的这种分布 (假设偏转角的分布是均匀的)

    bernoulli_distribution

    伯努利试验 (Bernoulli experiment):布尔离散分布,概率可配置

    投掷硬币 (p=0.5)

    geometric_distribution

    几何分布:重复伯努利试验,直到出现某一结果的试验次数

    抛掷骰子,记录“6”首次出现时的试验次数

    triangle_distribution

    ?

    ?

    exponential_distribution

    指数分布

    放射性物质发射 alpha 粒子的间隔时间

    normal_distribution

    无穷次重复伯努利试验的结果计数

    投掷硬币 10000 次,记录正面出现的次数

    lognormal_distribution

    对数正态分布 (lognormal distribution) (有时用于模拟)

    流水线工人的工作完成时间

    uniform_on_sphere

    任意给定维数空间的单位球面上的均匀分布

    在地球 (近似看作是球体) 表面任选一点去旅游

    1. void test_mt19937()  
    2. {  
    3. // 以时间为种子创建一个随机数发生器  
    4.     boost::mt19937 rng(time(0));  
    5. for (int i = 0; i < 100; ++i)  
    6.     {  
    7.         std::cout << rng() << std::endl;  
    8.     }  
    9. }  
    10. void test_rand48()  
    11. {  
    12.     boost::rand48 rng;  
    13. for (int i = 0; i < 10; ++i)  
    14.     {  
    15.         std::cout << rng() * 1.0 / std::numeric_limits<boost::rand48::result_type>::max() << std::endl;  
    16.     }  
    17. }  
    18. // uniform_smallint:在小整数域内的均匀分布  
    19. // uniform_int:在整数域上的均匀分布  
    20. // uniform_01:在区间[0,1]上的实数连续均匀分布  
    21. // uniform_real:在区间[min,max]上的实数连续均匀分布  
    22. // bernoulli_distribution:伯努利分布  
    23. // binomial_distribution:二项分布  
    24. // cauchy_distribution:柯西(洛伦兹)分布  
    25. // gamma_distribution:伽马分布  
    26. // poisson_distribution:泊松分布  
    27. // geometric_distribution:几何分布  
    28. // triangle_distribution:三角分布  
    29. // exponential_distribution:指数分布  
    30. // normal_distribution:正态分布  
    31. // lognormal_distribution:对数正态分布  
    32. // uniform_on_sphere:球面均匀分布  
    33. void test_random_distribute()  
    34. {  
    35.     boost::mt19937 rng(time(0));  
    36. // 1. uniform_int  
    37.     boost::uniform_int<> ui(0, 255);  
    38. for (int i = 0; i < 10; ++i)  
    39.     {   
    40.         std::cout<< ui(rng) << std::endl;  
    41.     }  
    42. // 2. uniform_01  
    43.     boost::uniform_01<boost::mt19937&> u01(rng);  
    44. for (int i = 0; i < 10; ++i)  
    45.     {   
    46.         std::cout<< u01() << std::endl;  
    47.     }  
    48. }  
  • 相关阅读:
    oo第二次总结
    oo第一次总结
    OO最后一次博客儿
    OO作业总结第三弹
    OO作业总结第二弹
    初学面向对象
    hi🎈
    散列函数及其应用
    结对项目作业
    构建之法第四,第十四章读书有感 (另补第十七章)
  • 原文地址:https://www.cnblogs.com/liaocheng/p/4233816.html
Copyright © 2011-2022 走看看