🥦随机数
2022-6-20
| 2023-8-2
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property
 
C++11前,依赖C库的rand函数生成随机数,它生成均匀分布的伪随机整数,范围为0~一个系统相关的最大值(至少为32767)之间,它不能生成任意范围的随机数,不能生成随机浮点数,也不能生成非均匀分布的随机数,为解决这些不足所作的一些操作可能会引入非随机性。
 
C++11引入了头文件random,其中包含随机数引擎类和随机数分布类:
notion image
 
标准库定义了多个随机数引擎,区别在于性能和随机性质量不同,每个编译器都会指定一个随机数引擎为default_random_engine类型,它具有最常用的特性。
 
随机数引擎操作:
notion image
通常,随机数引擎的输出不能直接使用,因为生成的随机数的值范围与我们需要的通常不符,而正确转换随机数范围是极其困难的,因此称之为原始随机数。
为得到指定范围内的数,使用分布类型对象:
随机数发生器指分布对象和引擎的组合。
default_random_engine引擎的输出范围是e.min()e.max(),而rand函数的输出范围为0~RAND_MAX
随机数发生器每次运行都会返回相同的数值序列。但可以通过将一个函数中的分布和引擎都定义为static的,这样在函数调用之间都会保持住状态,从而第二次调用时的输出与第一次调用的输出是连续的。
随机数发生器每次运行都生成相同随机数列的特性在调试程序时比较有用。
可以利用种子来生成不同的随机数列。种子是一个数值,引擎可以每次调用它从序列中一个新位置重新开始生成随机数:
最常用的种子是系统函数time,定义在ctime头文件中,返回从一个特定时刻(1970-01-01 00:00:00)到现在过了多少秒(UNIX时间戳)。time函数接受一个指针参数,指出用于写入时间的数据结构,如指针为空,则只返回UNIX时间戳:
time返回以秒计的时间,因此不适用于生成种子的间隔小于一秒的应用。
程序常需要不同类型和分布的随机数列,通过定义不同的分布对象来满足这两方面要求。
 
如要生成0~1内的随机浮点数,常用但不正确的方法是rand的结果除RAND_MAX,由于随机整数除RAND_MAX的精度通常低于随机浮点数,因此一些浮点数永远不会出现。用新标准库可以实现:
 
分布类型操作:
notion image
生成浮点值的分布类型默认生成double值,生成整型值的分布默认生成int值。它们通过模板类型参数来实现不同的生成类型,当想用默认的模板实参时:
生成正态分布随机数:
只有一个不接受模板参数的分布类,它是bernoulli_distribution,它是一个普通类,返回bool值,返回truefalse的概率都是常数0.5:
 
调整伯努利分布的true的概率:
  • C++
  • 正则表达式命名空间
    目录