c++11 随机数random

c++11提供的<random>实现了随机数库,它通过随机数引擎类(random_number_engines)产生随机数序列,随机数分布类(random-number distribution)使用随机数引擎生成服从特定概率分布的随机数。

让我们看一个简单的例子:

#include <iostream>
#include <random>

using std::cout; using std::endl;
using std::default_random_engine;

int main()
{
    default_random_engine e;
    for (size_t i = 0; i < 10; ++i) //生成十个随机数
       cout << e() << endl;
    cout << "Min random:" << e.min() << endl; //输出该随机数引擎序列的范围
    cout << "Max random:" << e.max() << endl;
    return 0;
}

生成的随机数结果:

在例子中,随机数类是定义在std命名空间的,所以要声明。随机数引擎是函数对象,这就是为什么使用e()去生成随机数。程序每次运行都会生成相同的随机数序列,这在一定程度有利于程序的调试,但我们有时需要每一次运行产生的随机数序列都是不同的。我们可以通过设置随机数引擎的种子来改变引擎的状态,没有改变时是使用默认的随机数种子,这就是为什么每一次都生成同样的随机数序列。从结果我们可以知道,默认的种子生成随机数范围在1-2147483646之间。

#include <iostream>
#include <random>

using std::cout; using std::endl;
using std::default_random_engine;

int main()
{
    default_random_engine e; //或者直接在这里改变种子 e(10)
    e.seed(10); //设置新的种子
    for (size_t i = 0; i < 10; ++i)
       cout << e() << endl;
    cout << "Min random:" << e.min() << endl;
    cout << "Max random:" << e.max() << endl;

    return 0;
}

设置新的种子后结果如下:

在结果可以看出,生成随机数序列不同了。在这里范围还是一样的,那么怎么去改变生成的范围呢?这时就可以使用随机数分布类了。

#include <iostream>
#include <random>

using std::cout; using std::endl;
using std::default_random_engine;
using std::uniform_int_distribution;

int main()
{
    default_random_engine e;
    uniform_int_distribution<unsigned> u(0, 9); //随机数分布对象
    for (size_t i = 0; i < 10; ++i)  //生成范围为0-9的随机数序列
       cout << u(e) << " ";
    cout << endl;

    return 0;
}

结果如下:

这里要注意的这个序列也是每次运行程序相同的,因为分布对象将随机数引擎作为它的参数,分布对象使用它的引擎参数生成随机数,并将其映射到指定的分布。

---------------------------------------------------------------------------------------------------------------------------------------

现在,让我更深入一点吧,在图形上很多时候都要使用0.0-1.0的值(颜色)作为数据,那么怎么生成这样的序列呢?跟刚才那样,我们可以使用分布区定义范围。

#include <iostream>
#include <random>

using std::cout; using std::endl;
using std::default_random_engine;
using std::uniform_real_distribution;

int main()
{
    default_random_engine e;
    uniform_real_distribution<double> u(0, 1); //随机数分布对象
    for (size_t i = 0; i < 5; ++i)  //生成范围为0.0-1.0的随机数序列
       cout << u(e) << " ";
    cout << endl;

    return 0;
}

结果:

在这里分布类改变了类型,采用的是real实数类型的分布类,实例化为<double>,生成0.0-1.0的double随机数序列。如果你想要获得分布类范围的端点,只要简单的成员函数min()和max()就可以了。

随机数的重要性质是随机分布,但是我们也可以生产非均匀分布的随机数序列。

下面的例子生成符合正态分布的随机数序列:

#include <iostream>
#include <random>
#include <vector>
#include <string>

using std::cout; using std::endl;
using std::default_random_engine;
using std::normal_distribution;
using std::vector; using std::string;

int main()
{
    default_random_engine e;
    vector<unsigned> vals(9);
    normal_distribution<> n(4, 1.5); //正态分布,大部分生成的随机数落在0-8之间
    for (size_t i = 0; i != 200; ++i)
    {  unsigned v = lround(n(e)); //舍入到最近整数
       if (v < vals.size())
          ++vals[v];        //统计0-8数字出现的次数
    }
    for (decltype(vals.size()) i = 0; i != vals.size(); ++i)
       cout << i << ": " << string(vals[i], ‘#‘) << endl;

    return 0;
}

结果:

更多资料可看:C++Primer 5th

或者 :http://www.cplusplus.com/reference/random/?kw=random

时间: 2024-10-08 10:54:00

c++11 随机数random的相关文章

C++11 随机数

1 /************************************************************************* 2 > File Name : test_random_device.cc 3 > Author : sanghai 4 > Mail : [email protected] 5 > Created Time: 2017年08月12日 星期六 02时11分04秒 6 ********************************

(五)boost库之随机数random

(五)boost库之随机数random boost库为我们提供了许多的日常随机数生成器: 1.uniform_smallint:在小整数域内的均匀分布 2.uniform_int:在整数域上的均匀分布 3.uniform_01:在区间[0,1]上的实数连续均匀分布 4.uniform_real:在区间[min,max]上的实数连续均匀分布 5.bernoulli_distribution:伯努利分布 6.binomial_distribution:二项分布 7.cauchy_distributi

shell脚本获取随机数random

用C提供的取随机数的方法srand和rand, 前者是给后者设置随机数种子seed. int rnd_num = 0; srand(seed); // time(NULL) 通常使用时间做种子 rnd_num = rand(); // 产生随机数 产生种子的方法: 1. 使用日期时间 时间作为种子很简单,取当前日期和时间,但是存在一个陷阱:当多台机器并发执行产生随机数时,出现相同随机数的概率非常高.不推荐这种方式 2. 使用$RANDOM 需要系统支持,通过echo来检测, 打印出一个随机数字,

js随机数random()方法

js随机数random()方法 var  num=Math.random();//生成一个[0-1)的随机数即包括0,不包括1这个是值域取值.   第一.通常我们会生成一个0-9的随机整数,比如用来for里面的循环次数; var a=parseInt(Math.random()*10,10);  //取值范围 [0,9] var b=Math.floor(Math.random()*10); //取值范围 [0,9] var c=Math.ceil(Math.random()*9);//取值范围

Python随机数random模块学习,并实现生成6位验证码

一.前言 学习python随机数random模块的使用 ,并使用模块中的函数,实现6位验证码生成 二.random模块 1.random.random() 返回0-1直接的随机数,类型为float >>>print(random.random()) 0.1259184691662908 2.random.randint(1, 8) 返回1-8直接的随机数,包括8 >>>print(random.randint(1, 8)) 3 3.random.choice() 从一个

java的随机数Random

测试1 1 package com.lv.study.pm.second; 2 3 public class TestMath { 4 5 public static void main(String[] args) { 6 7 //随机得到一个浮点数Math.random() 8 System.out.println(Math.random()*100/10); 9 10 int it=(int) (Math.random()*1000/10); 11 System.out.println(i

C# 产生随机数 Random

示例1:随即产生1000-9999的int数值 Random rad = new Random();//实例化随机数产生器rad: int value = rad.Next(1000, 10000);//用rad生成大于等于1000,小于等于9999的随机数: 注意1:如果是循环输出N个随机数,则需要将创建随机类的代码 “Random rad = new Random();” 放到循环的上边. 相关链接: https://msdn.microsoft.com/zh-cn/library/syst

产生随机数 random

int rand(void); 返回 0 ------- RAND_MAX 之间的一个 int 类型整数,该函数为非线程安全函数.并且生成随机数的性能不是很好,已经不推荐使用.        void srand(unsigned int seed);          设置种子值,一般与“当前时间|进程ID”作为种子,如果没用调用该函数,则通过rand返回的默认种子值为1     long int random(void);    官方推荐使用的函数为 :返回 0 ------- RAND_M

实现java随机数Random的几招

一,在java.util这个包里面提供了一个Random的类,我们可以新建一个Random的对象来产生随机数,可以产生随机整数.随机float.随机double,随机long,这个也是我们经常用的一个取随机数的方法.  二,在我们的System类中有一个currentTimeMillis()方法,这个方法返回一个从1970年1月1号0点0分0秒到目前的一个毫秒数,返回类型是long,我们可以拿他作为一个随机数,我们可以拿他对一些数取模,就可以把他限制在一个范围之内啦  三,其实在Random的默