梅森旋转产生随机数c语言实现,C++生成随机数的实现代码
C风格
C为随机数提供的工具是rand、srand和RAND_MAX,定义在中。
srand为rand设置种子,如果不设置,相当于调用过srand(1)。rand产生伪随机数,其范围为0到RAND_MAX,RAND_MAX至少是32767,在MSVC和GCC中这个值都是32767。
伪随机数看似随机,实则是有规律可循的,对于相同的种子值,rand产生的序列完全相同,也就是说无论你给srand一个什么数字,多次运行程序的结果都将相同——除非你给srand的是不同的数字,比如时间。中的time函数返回整数表示的系统时间,可用于设置种子。
如果我们只需要0到9的随机数,可以把rand的返回值% 10;如果是42到233,可以写rand() % 192 + 42。下面的random函数封装了这项工作。注意只有在b - a + 1远小于或整除RAND_MAX时随机数的分布才比较均匀。
#include
#include
#include
int random(int a, int b)
{
return rand() % (b - a + 1) + a;
}
int main()
{
srand(time(NULL));
printf("RAND_MAX = %d\n", RAND_MAX);
for (int i = 0; i < 10; i++)
printf("%d ", rand());
printf("\n");
int count[10] = {0};
for (int i = 0; i < 10000; i++)
count[random(0, 9)]++;
for (int i = 0; i < 10; i++)
{
printf("%d: ", i);
for (int j = 0; j < count[i] / 10; j++)
printf("*");
printf("\n");
}
}
C++风格
从C++11开始,C++标准规定了随机数设施,包括均匀随机位生成器(Uniform random bit generators,URBG)和随机数分布等,定义在中。
URBG分为随机数引擎、引擎适配器、预置随机数生成器和非确定随机数生成器4类,通常后两类就够用了。
标准规定了3种随机数引擎:
线性同余linear_congruential_engine(LCG),时间空间消耗都少;
梅森旋转mersenne_twister_engine(MT),占用较多内存(在PC上可以忽略),计算量较大;
带进位减法(属于滞后斐波那契生成器,LFG)subtract_with_carry_engine,性能与效果折中。
随机数引擎都需要一个种子,生成的都是伪随机数。
引擎适配器可以套一个随机数引擎:
discard_block_engine在连续若干个伪随机数中选择若干个;
independent_bits_engine把位数多的伪随机数压缩成位数少的;
shuffle_order_engine把连续若干个伪随机数重排。
套娃的方式是模板,理论上你还可以用适配器套适配器,不过CPU可能会有意见。
随机数引擎的模板参数怎么取?标准定义了一些数学家们发现的效果良好的随机数引擎:LCG minstd_rand0、minstd_rand、knuth_b;MT mt19937、mt19937_64;LFG ranlux24_base、ranlux48_base、ranlux24、ranlux48。如果你还是无从下手,那就用default_random_engine,编译器的开发者们为你选好了他们认为最合适的,在MSVC中是mt19937,在GCC中是minstd_rand0。
以上工具都生成伪随机数,标准还定义了真·随机数引擎random_device,尽管标准也允许它是伪随机的。如果它是真随机的,那么使用起来它的效果无疑是最好的,但是多次调用后性能会急剧下降,通常只用于生成伪随机数引擎的种子。
随机数生成器类型都定义了静态方法min和max,返回生成的随机数的范围,以及无参数的函数调用运算符operator(),返回随机数。
#include
#include
int main()
{
auto engine = std::default_random_engine(std::random_device()());
std::cout << "min = " << engine.min() << "; max = " << engine.max() << std::endl;
std::cout << "random numbers: ";
for (int i = 0; i != 10; ++i)
std::cout << engine() << ' ';
std::cout << std::endl;
}
大多数情况下我们不需要min到max范围的整数,而需要一定分布的整数或实数。标准规定了许多随机数分布类型,我数学不好,不太懂这些。
均匀分布uniform_int_distribution、uniform_real_distribution;
伯努利分布bernoulli_distribution、binomial_distribution、negative_binomial_distribution、geometric_distribution;
泊松分布poisson_distribution、exponential_distribution、gamma_distribution、weibull_distribution、extreme_value_distribution;
正态分布normal_distribution、lognormal_distribution、chi_squared_distribution、cauchy_distribution、fisher_f_distribution、student_t_distribution;
抽样分布discrete_distribution、piecewise_constant_distribution、piecewise_linear_distribution。
构造分布实例时传入分布的参数。调用operator()获得结果,参数为随机数引擎。
#include
#include
#include
int main()
{
auto engine = std::default_random_engine(std::random_device()());
std::uniform_int_distribution uniform(0, 9);
int count[10] = {0};
for (int i = 0; i != 10000; ++i)
++count[uniform(engine)];
for (int i = 0; i != 10; ++i)
std::cout << i << ": " << std::string(count[i] / 10, '*') << std::endl;
}
注意,与STL中左闭右开的习惯不同,uniform_int_distribution构造函数接受的参数是闭区间。
到此这篇关于C++生成随机数的实现代码的文章就介绍到这了,更多相关C++生成随机数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
梅森旋转产生随机数c语言实现,C++生成随机数的实现代码相关推荐
- c语言中什么情况下会出现随机数,C语言中如何产生随机数
今天看到一段小程序 ,里面用到随机数.才发现在C语言中产生随机数不像matlab中那么简单. C中也有rand()函数,但是rand()函数产生的数不是真正意义上的随机数,是一个伪随机数,是根据一个数 ...
- JAVA梅森旋转随机算法,C语言实现梅森旋转算法
原理: 梅森旋转算法是一种伪随机数生成算法 1.定义相关宏和结构体 #include #include #include #include typedef unsigned int uint; #de ...
- C语言详解生成随机数的过程,time函数、时间戳timer、rand函数和srand函数,附猜数字小游戏
第十一篇:随机数详解 一.准备工作(预备知识) 1.1.生成伪随机数(函数rand) 1.2.伪随机数"变成"随机数(函数time) 1.3.生成确定范围随机数 二.练手随机数经典 ...
- c语言产生32位随机数,C语言,如何产生随机数
1. 基本函数 在C语言中取随机数所需要的函数是: int rand(void); void srand (unsigned int n); rand()函数和srand()函数被声明在头文件stdl ...
- R语言处理数据——生成随机数
生成随机数 #如下连续生成16组1:3的随机不重复整数(每次3个),存储至repl中: repl <- NULL for(x in 1:16) {repl <- c(repl, sampl ...
- 利用计算机可产生随机数,一种利用计算机生成随机数的方法
一种利用计算机生成随机数的方法 (2012-07-16 23:22:33) 标签: 随机数 函数 数值 计数器 程序运行 杂谈 这里介绍一种利用计算机生成随机数的方法,微机都有系统计数器记录自运行开始 ...
- css随机数,在LESS CSS中生成随机数?
通过LESS Mixin for Variation 通过使用LESS mixin生成随机数,您可以根据需要在每个位置调用它,更容易控制输出.此代码部分是在this SO answer的帮助下构建的, ...
- python生成随机数random操作_Python random生成随机数示例
代码中经常有一些生成随机数的需求.特意整理了一下Python中random模块的一些相关使用方法示例. python生成随机数 随机整数: >>> import random > ...
- python生成随机数列表并排序_python_生成随机数与列表排序
1. 列表排序可采用两种方法 sorted(list) 直接改变list 调用list的方法 list.sort 2. random.randint(a,b) 生成大于等于a小于等于b的整数 ran ...
最新文章
- 机器学习 集成学习篇——python实现Bagging和AdaBOOST算法
- c语言中size of 用法,C语言中sizeof()的用法
- 利用ajax赋值,jquery利用async在ajax中给全局变量赋值
- python中re模块_python中re模块的使用以及一些正则表达式的总结
- 点击SAP Fiori Launchpad某个tile后遇到的错误消息如何解决
- 【Spring] Spring boot 报错 Unable to start ServletWebServerApplicationContext due to missing ServletWe
- vue-router下的html5 history在iis服务器上的设置 vue去掉#
- iOS底层探索之Block(三)——Block的本质
- PHP生成阿里云oss水印里的文字
- Atitit 编程语言常用算法attilax总结
- mapgis安装|计算机中丢失basroot.dll
- 2021华硕秋季新品发布会:每一幕,都精彩
- 有哪些免费不收费的文件数据恢复软件?
- 川农《组织行为学(本科)》21年12月作业考核
- 上帝掷骰子吗?量子物理史话——读书笔记
- Docker 错误 “port is already allocated” 解决方法
- 【Books系列】席慕蓉《回眸》欣赏
- 2016-8-17晨型养成第二天
- js前置递增和后置递增
- 算法设计与分析: 6-8 圆排列问题
热门文章
- 安卓学习笔记02:测试安卓开发环境
- Spring学习笔记:配置单数据源
- MyBatis框架笔记04:MyBatis关联数据查询
- python樱花树代码_【推荐】手把手教你如何用Python画一棵漂亮樱花树含源码
- 2017.9.21 所驼门王的宝藏 思考记录
- 【Level 09】U1 The way I see it L1 A great adventure
- 【英语学习】【Level 08】U03 My Choice L1 Good books are like good friends
- 【英语学习】【WOTD】hypermnesia 释义/词源/示例
- Java程序员晋升之路:“Java高级核心知识全面解析
- 文件与用户管理linux实验,实验03 Linux用户和权限管理