linear_congruential_engine 类模板实现了一个最老且最简单的生成整数随机序列的算法,它被叫作线性同余法。这个算法包含 3 个参数:乘数 a、增量 c 和模 m。这些值的选择对于生成合理质量的随机序列至关重要。这个过程需要单个的整数种子和第一个随机值 x,x 理论上可以像这样计算:
unsigned int x = (a*seed + c) % m;
每个随机数 xn 都可以用下面这个等式生成下一个 xn+l :
xn+1=(axn+c) modm
显然,因为随机值是余数,可以生成的不同值的最大个数是 m,并且 a 和 c 的选择不多,它所生成的值的个数会比 m 更少。然而这个算法是简单快速的,在髙质量的随机序列对程序很重要时,最好选择其他引擎实例的生成器,例如 mersenne_twister_engine。
基于线性同余的生成器
有两个被定义为 linear_congmential_engine 模板实例别名的随机数生成器类型:minstd_rand() 和生成 32 位无符号整数的 minstd_rand。名字来自于 “minimum s
tan
dard random number generator” minstd_rand() 是 1998 年由 Stephen K.Park 和 Keith W.Miller 为生成随机数而提出的最低标准,因为那时候的生成器很少。a 被定义为 16 807,c 是 0,m 是 2 147 483 647。 m 的值是小于 232 的最大梅森素数。minstd_rand 生成器是 a 为 48271 的 minstd_rand() 的一个改进版本。
归因于 Donald Knuth, knuth_b 随机数生成器实现了一个可以将 shuffle_order_engine 适配器应用到 minst_rand() 生成器所产生的值上的算法。这被描述在他的经典著作《计算机程序设计的艺术:卷2》中,并伴随着大量的随机数生成方法和随机性测试。通过移除连续值之间的依赖来运用适配器增加序列的“随机性”。
这些生成器(事实上所有的生成器)的使用方式都和前面看到的 default_random_ engine 相同,例如:
std::random_device rd;
std::minstd_rand rng {rd()};
std::uniform_int_distribution<long> dist {-5L, 5L};
for(size_t i{}; i < 8; ++i)
std::cout << std::setw (2) << dist (rng) <<" "; // 3 -5 -2 4 -5 4 1 0
<
上一页
C++ 随机数生成器和随机数引擎
C++梅森旋转算法
下一页
>
socket
Python基础教程
MySQL函数
MySQL
C语言入门
C语言专题
C语言编译器
C语言编程实例
GCC编译器
C语言项目案例
C++教程
OpenCV
Unity 3D教程
Redis
Android教程
JavaScript
Mybatis
Spring Cloud
Maven
Spring Boot
Spring MVC
Hibernate
Linux
Linux命令
Shell脚本
Java教程
Spring
Servlet
Struts2
Java Swing
JSP教程
CSS教程
TensorFlow
Go语言教程
Docker
VIP视频
Go语言GOPATH详解(Go语言工作目录)
C++ vector获取(访问)元素
Python类对象的创建和使用
C#命名方法委托
Google App Engine是什么?
汇编语言EXTERN伪指令:调用外部过程
C语言strcpy()函数:字符串复制(拷贝)函数
Hibernate Criteria接口 createAlias方法:建立连接查询
Spring getConnectionProperties方法:获取数据库连接属性
JS every()方法:检测数组元素是否全部符合指定条件