iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++11生成随机数(random库)的使用
  • 602
分享到

C++11生成随机数(random库)的使用

2024-04-02 19:04:59 602人浏览 八月长安
摘要

目录1. 随机数引擎和分布1.1 分布类型和引擎1.2 使用引擎生成一个数值序列1.3 设置随机数发生器种子2. 其他随机数分布2.1 生成随机实数2.2 生成非均匀分布的随机数在

c++ 程序中,在新标准出现之前,C 和 C++ 都依赖一个简单的 C 库函数 rand 来生成随机数,但是,这个函数生成的是均匀分布的伪随机数,每个随机数的范围在 0 和一个系统相关的最大值(至少为 32767)之间。

  rand 函数有一些问题:即使不是大多数,也有很多程序需要不通范围的随机数。一些应用需要随机浮点数。一些程序需要非均匀分布的随机数。而在编写程序为了解决这些通常会转换 rand 生成的随机数的范围、类型或者是分布时,常常会引入非随机性。

  在 C++ 11 标准中,定义在头文件 random 中的随机数库通过一组协作的类来解决这些问题,主要用到的是两个类:

  • 随机数引擎类(random-number engines)
  • 随机数分布类(random-number distribution)

其中,一个引擎类可以生成 unsigned 随机数列,一个分布使用一个引擎类生成指定类型的,在给定范围内的,服从指定概率分布的随机数。

1. 随机数引擎和分布

  随机数引擎是函数对象类,他们定义了一个调用运算符,该运算符不接受参数并返回一个随机的 unsigned 整数。我们可以通过调用一个随机数引擎对象来生成原始随机数。

default_random_engine e;    // 生成随机无符号数
for(size_t i=0; i<10; i++)
    // e() “调用”对象来生成下一个随机数
    cout << e() <<endl;

在上面这几行的代码中,定义了一个名为 e 的 default_random_engine 的对象。在 for 循环内,我们调用对象 e 来获得下一个随机数。

1.1 分布类型和引擎

  为了得到一个在指定范围内的数,我们一用一个分布类型的对象:

//生成 0 到 9 之间(包含)均匀分布的随机数
unifORM_int_distribution<unsigned> u(0,9);
default_random_engine e;    // 生成无符号随机整数
for (size_t i =0;i<10; i++)
    // 将 u 作为随机数源
    // 每个调用返回在指定范围内并服从均匀分布的值
    cout<<u(e)<<" ";
cout<< endl;

上面的代码输入如下:

0 1 7 4 5 2 0 6 6 9

  上面的程序中,我们将 u 定义为 uniform_int_distribution<unsigned> 。这种类型生成均匀分布的 unsigned 值。当我们定义一个这种类型的对象时,可以提供想要的最小值和最大值。在上面这段代码中,u(0,9) 表示我们希望得到 0 到 9 之间(包含)的数。随机数分布类会使用包含的范围,从而我们可以得到给定整形的每个可能值。

  类似引擎类型,分布类型也是函数对象类。分布类型定义了一个调用运算符,它接受一个随机数引擎作为参数。分布对象使用它的引擎参数生成随机数,并将其映射到指定的分布。

  传递给分布对象的是引擎对象本身,也就是 u(e),如果我们将调用写为 u(e()),含义就变为将 e 生成的下一个值传递给 u,这会导致一个编译错误。我们传递的是引擎本身,而不是他生成的下一个值,原因是某些分布可能需要调用引擎多次才能得到一个值。

1.2 使用引擎生成一个数值序列

  随机数发生器有一个特性,也就是即使生成的树看起来是随机的,但是对于一个给定的发生器,每次运行程序它都会返回相同的数值序列。序列不变这一事实在 调试 的时候十分有用,但是另一方面,使用随机数发生器的程序也必须考虑到这一特性。

  下面介绍一个例子,需要一个函数生成一个 vector,包含 100 个均匀分布在 0 到 9 之间的随机数。一种错误的方法是使用下面的代码:

vector<unsigned >bad_randVec()
{
    default_random_engine e;
    uniform_int_distribution<unsigned >u(0,9);
    vector<unsigned >ret;
    for(size_t i = 0;i<100;i++)
        ret.push_back(u(e));
    return ret;
}
// 但是 每次调用这个函数都会返回相同的 vector
vector<unsigned >v1(bad_randVec());
vector<unsigned >v2(bad_randVec());
// 将会打印输出 equal
cout << ((v1==v2) ? "equal" : "not equal") << endl;

上面这段代码会输出 equal,因为 vector v1 和 v2 具有相同的值。

正确的定义方法是 将引擎和关联的分布对象定义为 static 的

 vector<unsigned >Good_randVec()
{
    // 由于我们希望引擎和分布对象保持状态,因此应该将他们定义为
    // static 的,从而每次调用都生成新的数
    static default_random_engine e;
    static uniform_int_distribution<unsigned > u(0,9);
    vector<unsigned > ret;
    for(size_t i = 0; i<100;i++)
        ret.push_back(u(e));
    return ret;
}

由于 e 和 u 都是 static 的,因此它们在函数调用之间会保持住状态。第一次调用会使用 u(e) 生成的序列中的前 100 个随机数,第二次调用会获得接下来 100 个。以此类推。

  注意,一个给定的随机数发生器已知会生成相同的随机数序列。一个函数如果定义了局部的随机数发生器,应该将其(包括引擎和分布对象)定义为 static 的。否则,每次调用函数都会生成相同的序列。

1.3 设置随机数发生器种子

  随机数发生器会生成相同的随机数序列这一特性在调试中很有用。但是,一旦我们的程序调试完毕,我们通常希望每次运行程序都会生成不同的随机结果,可以通过提供一个种子(seed)来达到这个目的。种子就是一个数值,殷勤可以利用它从序列中一个新位置重新开始生成随机数。

  为引擎设置种子有两种方式:

  • 在创建引擎对象时提供种子
  • 调用引擎的 seed 成员
    // 几乎肯定是生成随机整数 vector 的错误方法
    // 每次调用这个函数都会生成相同的 100 个数
    default_random_engine e1;       // 使用默认种子
    default_random_engine e2(2147483646);       // 使用给定的种子值
    // e3 和 e4 将会生成相同的序列,因为他们使用了相同的种子
    default_random_engine e3;
    e3.seed(32767);             //调用 seed 设置为一个新种子值
    default_random_engine e4(32767);    // 将种子值设置为 32767
    for(size_t i = 0;i != 10; i++)
    {
        if (e1() == e2())
            cout<<"unseeded match at iteeration: "<<i<<endl;
        if (e3() != e4())
            cout<<"seeded differs at itertion: "<<i<<endl;
    }

设置种子最常用的方法是调用系统函数 time ,这个函数定义再头文件 ctime 中,它返回一个特定时刻到当前经过了多少秒。函数 time 接受单个指针参数,它指向用于写入时间的数据结构。如果此指针为空,则函数简单的返回时间:

default_random_engine e1(time(0));  // 稍微随机些的种子--把0换成NULL也行

但是,由于 time 返回以秒计的时间,因此这种方式只适用于生成种子的间隔为秒级或更长的应用。

2. 其他随机数分布

2.1 生成随机实数

  程序常常需要一个随机浮点数源。特别是程序经常需要 0 到 1 之间的随机数。

  可一定以一个 uniform_real_distribution 类型的对象,并让标准库来处理从随机整数到随机浮点数的映射。与处理 uniform_int_distribution 一样,在定义对象时,我们指定最小值和最大值。

    default_random_engine e;        // 生成无符号随机整数
    // 0 到 1 (包含)的均匀分布
    uniform_real_distribution<double >u(0,1);
    for(size_t i =0;i<10;i++)
        cout<<u(e)<<" ";
    cout<<endl;

此外,当我们对分布函数不指定默认生成的类型参数时,程序会自动赋予一个类型,生成浮点值得分布类型默认生成 double 类型,生成整型值的分布类型默认生成 int 类型,如下:

uniform_real_distribution<>u(-1,1); // 默认生成 double 值

2.2 生成非均匀分布的随机数

  除了生成上面的均匀分布,C++ 11 还规定了可以生成 20 种不同的分布类型,比如 均匀分布uniform,正态分布normal,二项分布binomial,泊松分布poisson,学生分布 student 等等,相关函数可以查看相应的函数(具体可以参考 C++ Primer 781页)。

到此这篇关于C++11生成随机数(random库)的使用的文章就介绍到这了,更多相关C++11生成随机数内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++11生成随机数(random库)的使用

本文链接: https://www.lsjlt.com/news/163736.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++11生成随机数(random库)的使用
    目录1. 随机数引擎和分布1.1 分布类型和引擎1.2 使用引擎生成一个数值序列1.3 设置随机数发生器种子2. 其他随机数分布2.1 生成随机实数2.2 生成非均匀分布的随机数在 ...
    99+
    2024-04-02
  • 如何使用random库随机生成浮点数
    要使用random库随机生成浮点数,可以使用random模块中的random()函数。此函数返回一个0到1之间的随机浮点数。以下是一...
    99+
    2023-09-06
    random
  • python如何使用random()生成随机数
    这篇文章给大家分享的是有关python如何使用random()生成随机数的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。random()生成一个(0,1)指定范围内的随机浮点数运行结果如下:感谢各位的阅读!关于“p...
    99+
    2023-06-08
  • 如何用Random生成随机数
    本篇内容介绍了“如何用Random生成随机数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言在代码中生成...
    99+
    2024-04-02
  • java中怎么使用random生成随机数
    在Java中可以使用`java.util.Random`类来生成随机数。以下是使用`Random`类生成随机数的示例代码:```ja...
    99+
    2023-09-06
    java random
  • Java中的随机数Random怎么生成
    在Java中,可以使用Random类来生成随机数。以下是使用Random类生成随机数的示例代码:```javaimport java...
    99+
    2023-08-18
    Java random
  • C++11新特性之随机数库(Random Number Library)详解
    目录从前的随机数随机数库(Random Number Library)随机数引擎随机数分布类生成平均分布的整数生成平均分布的实数生成正态分布的实数生成概率可控的布尔值补充:真正的随机...
    99+
    2024-04-02
  • C++11随机数库怎么使用
    本篇内容主要讲解“C++11随机数库怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++11随机数库怎么使用”吧!从前的随机数C++11之前,无论是C,还是C++都使用相同方式的来生成随...
    99+
    2023-06-19
  • Python如何生成随机数及random随机数模块应用
    目录1、随机生成0-1的浮点数random.random2、随机生成指定范围内的浮点数random.uniform3、随机生成指定范围整数random.randint4、随机从给定集...
    99+
    2024-04-02
  • random中怎么随机生成10个数
    这期内容当中小编将会给大家带来有关random中怎么随机生成10个数,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。生成10个随机数import randomnum = ran...
    99+
    2023-06-02
  • python使用Random随机生成列表的方法实例
    目录引言:1.在python中用random生成一个列表。2.翻了一些资料找到了取值不重复的写法3.下面用冒泡排序来实验一下效果附:一行代码实现生成一个随机列表总结引言: 闲来想到冒...
    99+
    2024-04-02
  • C#中的随机数函数Random()怎么使用
    这篇文章主要介绍了C#中的随机数函数Random()怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#中的随机数函数Random()怎么使用文章都会有所收获,下面我们一起来看看吧。一、常用操作NextD...
    99+
    2023-06-30
  • C#中的随机数函数Random()
    一、常用操作 NextDouble():返回0-1.0之间的随机数Next():返回非负随机整数(0-216)Next(i):返回一个小于i的非负随机整数Next(i,j):生成i ...
    99+
    2024-04-02
  • C语言使用rand函数生成随机数
    目录rand()函数函数原型:初步使用生成0到99的随机数再次运行 发现问题查看rand()函数的官方文档srand()函数srand的官方介绍初步使用srand()再次运行发现问题...
    99+
    2024-04-02
  • c++怎么生成随机数
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-15
  • Java和C的随机数(Random)详解
    目录一、前言二、随机数的创建步骤1.导包2.创建对象:3.数据接收三、Java随机数游戏四、c语言的猜数字示例图:总结一、前言 前面我们学习了Java中的运算符,对运算符也有一些了...
    99+
    2024-04-02
  • C++中怎么生成随机数
    这篇文章将为大家详细讲解有关C++中怎么生成随机数,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。C++中常用rand()函数生成随机数,但严格意义上来讲生成的只是伪随机数(pseudo-ra...
    99+
    2023-06-17
  • Python随机数种子(random seed)的使用
    目录1. 随机数种子 2. numpy中的随机数种子 3. 随机数“顺序”的奥秘 在科学技术和机器学习等其他算法相关任务中,我们经常需要用到随机数,为了把握随机数的生成特性,从随机数...
    99+
    2024-04-02
  • 使用numpy生成随机数的方法
    numpy是一个在Python中非常常用的科学计算库,它提供了许多快速、高效的数值操作和数据处理函数。在numpy中,我们可以很方便地生成随机数。本文将介绍numpy中生成随机数的方法,并给出具体的代码示例。 numpy中生成随...
    99+
    2024-01-26
    Numpy 随机数
  • python随机函数random如何使用
    Python中的随机函数random可以通过导入random模块来使用。下面是几种常见的使用方法:1. 生成一个0到1之间的随机浮点...
    99+
    2023-10-10
    python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作