(c++11)随机数------c++程序设计原理与实践(进阶篇)
随机数既是一个实用工具,也是一个数学问题,它高度复杂,这与它在现实世界中的重要性是相匹配的。在此我们只讨论随机数哦最基本的内容,这些内容可用于简单的测试和仿真。在<random>中,标准库提供了复杂的方法来产生适应不同数学分布的随机数。这一随机数标准库基于下面两个基础概念:
- 发生器(engine,随机数发生器):发生器是一个可以产生均匀分布整形值序列的函数对象。
- 分布(distribution):分布是一个函数对象,给定一个发生器产生的序列作为输入,分布可以按照相应数学公式产生一个值的序列。
例如 http://www.cnblogs.com/goudanli/p/7856623.html 中的 random_vector()函数。调用random_vector(n)就会生成一个Matrix<double,1>类型的矩阵对象,它包含n个元素,元素值都是[0:n)之间的随机数。
Vector random_vector(Index n) {
Vector v(n);
default_random_engine ran{(unsigned int)(time(0)+2)};
uniform_int_distribution<> ureal{ 0,max0 };
for (Index i = 0; i < n; ++i)
{
v(i) = ureal(ran);
}
return v;
}
默认发生器(default_random_engine)简单、代价底、容易运行。对日常应用,它已经足够了。对于更专业的应用,标准库提供了其他发生器,它们有着更好的随机性和不同的执行代价。例如,linear_congurential_engine、mersenne_twidter_engine和random_device等。
std_lib_facilities.h中的两个随机数发生器定义如下
int randint(int min,int max){
static default_random_engine ran;
return uniform_int_distribution<>{min,max}(ran);
}
int randint(int max){
return randint(0,max);
}
这些函数经常会被用到,当然还有其他的,让我们看看正态分布如何产生:
auto gen=bind(normal_distribution<double>{15,4.0},
default_random_engine{});
<functional>中的标准库函数bind()构造了一个函数对象,当调用它时,它会调用它的第一个参数,并将第二个参数作为这次调用的参数。因而在本例中,gen()返回一个正态分布序列,其均值为15,方差为4.0,使用的是default_random_engine。示例:
vector<int>hist(2*15);
for(int i=0;i<500;++i)
++hist[int(round(gen()))]; for(int i=0;i!=hist.size();++i){
cout<<i<<'\t';
for(int j=0;j!=hist[i];++j)
cout<<'*';
cout<<'\n';
}
完整程序:
#include<iostream>
#include<random>
#include<functional>
using namespace std;
auto gen=bind(normal_distribution<double>{15,4.0},
default_random_engine{}); int main(){ vector<int>hist(2*15);
for(int i=0;i<500;++i)
++hist[int(round(gen()))]; for(int i=0;i!=hist.size();++i){
cout<<i<<'\t';
for(int j=0;j!=hist[i];++j)
cout<<'*';
cout<<'\n';
}
}
输出:
0 *
1
2
3 *
4 **
5 *
6 ***
7 **********
8 *************
9 *******************
10 ***************
11 **********************************
12 *********************************
13 **************************************
14 *********************************************************
15 ***************************************************
16 **********************************************
17 ******************************************
18 *************************************
19 ********************************
20 ****************************
21 ****************
22 ********
23 *******
24 ****
25 **
26
27
28
29
正态分布经常被用到,其他分布包括 bernoulli_distribution,exponential_distribution和chi_distribution。在《The C++ Programming Language》中能找到详细介绍。整数分布的返回值是闭区间[a:b],而实数(浮点)分布的返回值是开区间[a:b)。
默认情况下,程序的每次运行中,发生器(除了random_device)产生同样的序列。这非常有利于程序调试。如果希望同一发生器产生不同的序列,我们需要设定不同的初值。这一初始化过程被称为“种子”。例如:
auto gen1= bind(uniform_int_distribution<>{0,9},
default_random_engine{});
auto gen2= bind(uniform_int_distribution<>{0,9},
default_random_engine{10});
auto gen3= bind(uniform_int_distribution<>{0,9},
default_random_engine{5});
为了获得不可预测的序列,我们经常使用当前时间(以纳秒为单位)或其他类似的事物作为种子。
c++程序设计原理与实践(进阶篇)
(c++11)随机数------c++程序设计原理与实践(进阶篇)的更多相关文章
- 实现求解线性方程(矩阵、高斯消去法)------c++程序设计原理与实践(进阶篇)
步骤: 其中A是一个n*n的系数方阵 向量x和b分别是未知数和常量向量: 这个系统可能有0个.1个或者无穷多个解,这取决于系数矩阵A和向量b.求解线性系统的方法有很多,这里使用一种经典的方法——高斯消 ...
- gets()scanf()有害------c++程序设计原理与实践(进阶篇)
最简单的读取字符串的方式是使用gets(),例如: char a[12]; gets(a); 但gets()和scanf()是有害的,曾经有大约1/4的成功黑客攻击是由于gets()和它的近亲scan ...
- C++学习书籍推荐《C++程序设计原理与实践》下载
百度云及其他网盘下载地址:点我 编辑推荐 <C++程序设计原理与实践>是经典程序设计思想与C++开发实践的完美结合,是C++之父回归校园后对C++编程原理和技巧的全新阐述.书中全面地介绍了 ...
- 函数形参为基类数组,实参为继承类数组,下存在的问题------c++程序设计原理与实践(进阶篇)
示例: #include<iostream> using namespace std; class A { public: int a; int b; A(int aa=1, int bb ...
- 函数返回值string与返回值bool区别------c++程序设计原理与实践(进阶篇)
为什么find_from_addr()和find_subject()如此不同?比如,find_from_addr()返回bool值,而find_subject()返回string.原因在于我们想说明: ...
- 数值限制------c++程序设计原理与实践(进阶篇)
每种c++的实现都在<limits>.<climits>.<limits.h>和<float.h>中指明了内置类型的属性,因此程序员可以利用这些属性来检 ...
- 有符号数和无符号数------c++程序设计原理与实践(进阶篇)
有符号数与无符号数的程序设计原则: 当需要表示数值时,使用有符号数(如 int). 当需要表示位集合时,使用无符号数(如unsigned int). 有符号数和无符号数混合运算有可能会带来灾难性的后果 ...
- bitest(位集合)------c++程序设计原理与实践(进阶篇)
标准库模板类bitset是在<bitset>中定义的,它用于描述和处理二进制位集合.每个bitset的大小是固定的,在创建时指定: bitset<4> flags; bitse ...
- 编码原则实例------c++程序设计原理与实践(进阶篇)
编码原则: 一般原则 预处理原则 命名和布局原则 类原则 函数和表达式原则 硬实时原则 关键系统原则 (硬实时原则.关键系统原则仅用于硬实时和关键系统程序设计) (严格原则都用一个大写字母R及其编号标 ...
随机推荐
- 1122 Hamiltonian Cycle
题意:包含图中所有结点的简单环称为汉密尔顿环.给出无向图,然后给出k个查询,问每个查询是否是汉密尔顿环. 思路:根据题目可知,我们需要判断一下几个条件:(1).首先保证给定的环相邻两结点是连通的:(2 ...
- 温故而知新java事务
一.什么是Java事务 通常的观念认为,事务仅与数据库相关. 事务必须服从ISO/IEC所制定的ACID原则.ACID是原子性(atomicity).一致性(consistency).隔离性 (iso ...
- Nginx反向代理图片总结
配置需求: 内网192.168.80.205的机器上部署了一个Web项目,下文称web, url为http://192.168.80.205:8082. 并且使用nginx访问图片,url格式 ...
- whoosh----索引|搜索文本类库
先了解基本概念和步骤: Quick Start Whoosh是一个索引文本和搜索文本的类库,他可以为你提供搜索文本的服务,比如如果你在创建一个博客的软件,你可以用whoosh为它添加添加一个搜索功能以 ...
- sql 2012先分离迁移mdf mlf 文件到别的机器后附加 数据库成只读的修复方法
SQL Server2008附加数据库之后显示为只读时解决方法 从本地分离的数据库文件放到远程服务器上,附加数据库出现数据库为(只读情况) 阅读了以下两篇文章: 第一篇:http://blog.c ...
- div+css 左右两列自适应高度 ,以及父级div也跟着自适应子级的高度(兼容各大浏览器)
<style type="text/css" media="screen"> <!-- #main {width:500px;_height: ...
- [C#] 等待启动的进程执行完毕
有能有时候我们启动了一个进程,必须等到此进程执行完毕,或是,一段时间, 关闭进程后再继续往下走. Example sample1 等待应用程序执行完毕 //等待应用程序执行完毕 private voi ...
- Visual Studio 2005 C# 读写Excel文件
做作业的时候查了一点儿资料, 用的vs2k5 读 excel 发现用起来非常简单...现在编程语言没话说! 项目-添加引用-COM-Microsoft Excel 12.0 Object Librar ...
- Xcode迁移工程常见问题
[Xcode迁移工程常见问题] 1.Header Search Paths (HEADER_SEARCH_PATHS) 是否设置正确.在Search Paths group下. 2.Framework ...
- mongo 修改器 $inc/$set/$unset/$pop/$push/$pull/$addToSet
mongo $inc 可以对集合里面的某些值是数字的增减.看代码 $set 可以进行修改,并且不存在的时候默认添加. 同时还能该变数据的类型. 还可以该变内嵌元素的值 用.调用 $unset 删除 ...