C++11带来诸多特性,random就是其一.

随机数由生成器和分布器结合产生

  生成器generator:能够产生离散的等可能分布数值(需要种子,不然每次生存的随机数都一样)
  分布器distributions: 能够把generator产生的均匀分布值映射到其他常见分布,如均匀分布uniform,正态分布normal,二项分布binomial,泊松分布poisson
  种子:相当于外部传给随机数生成器的诱因,如果每次传入的种子一样,则每次生成的随机数还是一样
 
1.default_random_engine 
//std::default_random_engine engine();  //没有设置种子,每次生存的随机数都一样
std::default_random_engine engine(time(nullptr));  //设置了种子,每次种子都不一样
std::uniform_int_distribution<> dis(, );
for (int n = ; n < ; n++)
std::cout << dis(engine) << " " << std::endl;
注:default_random_engine 结合uniform_int_distribution生成的随机数是闭环[begin, end]
如果嫌每次调用都要传入generator对象麻烦,可以使用std::bind,要包含头文件functional,以后就可以直接调用dice()产生复合均匀分布的随机数。
//std::default_random_engine engine();  //没有设置种子,每次生存的随机数都一样
std::default_random_engine engine(time(nullptr));
std::uniform_int_distribution<> dis(, );
auto dice = std::bind(dis,generator);
for (int n = ; n < ; n++)
std::cout << dice() << " " << std::endl;

2. random_device

  标准库提供了一个非确定性随机数生成设备.在Linux的实现中,是读取/dev/urandom设备;Windows的实现居然是用rand_s,在这里强烈谴责一下.

  random_device提供()操作符,用来返回一个min()到max()之间的一个数字.如果是Linux(Unix Like或者Unix)下,都可以使用这个来产生高质量的随机数,可以理解为真随机数.

#include <iostream>
#include <random>
int main()
{
  std::random_device rd;
  for(int n=; n<; ++n)
    std::cout << rd() << std::endl;
  return ;
} //结合:default_random_engine使用生成指定范围内的真随机数
int main()
{
std::random_device rd;
std::default_random_engine engine(rd());
std::uniform_int_distribution<> dis(, );
auto dice = std::bind(dis, engine);
for (int n = ; n < ; n++)
std::cout << dice() << " " << std::endl;
}

2. random number engine

  标准把随机数抽象成随机数引擎和分布两部分.引擎用来产生随机数,分布产生特定分布的随机数(比如平均分布,正太分布等).

  标准提供三种常用的引擎:linear_congruential_engine,mersenne_twister_engine和subtract_with_carry_engine.第一种是线性同余算法,第二种是梅森旋转算法,第三种带进位的线性同余算法.第一种是最常用的,而且速度也是非常快的; 第二种号称是最好的伪随机数生成器;第三种没用过....

  随机数引擎接受一个整形参数当作种子,不提供的话,会使用默认值. 推荐使用random_device来产生一个随机数当作种子.(windows下爱咋整咋整,谁叫windows的random_device是调用rand_s)

#include <iostream>
#include <random> int main()
{
std::random_device rd;
std::mt19937 mt(rd());
for(int n = ; n < ; n++)
std::cout << mt() << std::endl;
return ;
}

3. random number distributions

  标准提供各种各样的分布,不过我们经常用的比较少,比如平均分布,正太分布...使用也很简单

//平均分布
#include <random>
#include <iostream>
int main()
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(, );
for(int n=; n<; ++n)
std::cout << dis(gen) << ' ';
std::cout << '\n';
}
//正太分布
#include <iostream>
#include <iomanip>
#include <string>
#include <map>
#include <random>
#include <cmath>
int main()
{
std::random_device rd;
std::mt19937 gen(rd()); // values near the mean are the most likely
// standard deviation affects the dispersion of generated values from the mean
std::normal_distribution<> d(5,2); std::map<int, int> hist;
for(int n=0; n<10000; ++n) {
++hist[std::round(d(gen))];
}
for(auto p : hist) {
std::cout << std::fixed << std::setprecision(1) << std::setw(2)
<< p.first << ' ' << std::string(p.second/200, '*') << '\n';
}
}
 

C++11 随机数的更多相关文章

  1. C++11随机数的正确打开方式

    C++11随机数的正确打开方式 在C++11之前,现有的随机数函数都存在一个问题:在利用循环多次获取随机数时,如果程序运行过快或者使用了多线程等方法,srand((unsigned)time(null ...

  2. [转]C++11 随机数学习

    相对于C++ 11之前的随机数生成器来说,C++11的随机数生成器是复杂了很多.这是因为相对于之前的只需srand.rand这两函数即可获取随机数来说,C++11提供了太多的选择和东西. 随机数生成算 ...

  3. C++11随机数发生器

    前言 一直知道所谓的"随机数"都是伪随机,事实上也是满足某种规则生成的.有些程序测试时通常需要一个随机数源,但在新标准出现之前,C++都是依赖简单的C库函数rand来生成随机数的. ...

  4. C++11 随机数生成器

    背景 考试想造浮点数然后发现不会 正好下午被虎哥茶话会 谈到了一些不会的问题balabala的 被告知\(C++11\)有些神奇特性(哦豁) 然后就学习了一手看上去没什么用的随机数生成器\(QwQ\) ...

  5. C++11随机数库

    random随机数库 C++11引入了新的随机数生成机制,那就是<random>随机数库,支持多种伪随机数生成算法,多种连续和离散随机数分布算法,以及封装了真正的随机数生成引擎random ...

  6. C语言基础(11)-随机数发生器

    一. rand() rand是一个C语言库函数,功能是生成一个随机数.rand需要一个不同的种子,才能生成不同的随机数. 二. srand(int seed) rand需要一个不同的种子,才能生成不同 ...

  7. Java学习笔记2(输入与随机数简单介绍)

    输入: import java.util.Scanner; public class ScannerDemo{ public static void main(String[ ] args){ Sca ...

  8. 常用类--Date日期类,SimpleDateFormat日期格式类,Calendar日历类,Math数学工具类,Random随机数类

    Date日期类 Date表示特定的时间,精确到毫秒; 构造方法: public Data() public Date(long date) 常用方法: public long getTime() pu ...

  9. c++随机数问题研究

    1.问题背景 某项目中有个复杂的排序,先是各种规则依次排序,最后如果依然并列的话,那就随机位置,名次并列.测试中发现一个诡异现象,并列时随机排序但随机后2个case打印的顺序每次都一样,随机数没有起到 ...

随机推荐

  1. HDUOj Ignatius and the Princess III 题目1002

     母函数  组合数学 #include<stdio.h> int c1[125]; int c2[125]; int main() { int n,i,j,k; while(scanf ...

  2. 算法笔记_197:历届试题 带分数(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 100 可以表示为带分数的形式:100 = 3 + 69258 / 714. 还可以表示为:100 = 82 + 3546 / 197. ...

  3. Linux 如何判断自己的服务器是否被入侵

    如何判断自己的服务器是否被入侵了呢?仅仅靠两只手是不够的,但两只手也能起到一些作用,我们先来看看UNIX系统上一些入侵检测方法,以LINUX和solaris为例. 1.检查系统密码文件 首先从明显的入 ...

  4. 在Html.ActionLink中运用二维判断语句

    @Html.ActionLink("公告信息", "notice", "article", null, new { @class = Vie ...

  5. [Done]ftp使用小结

    基本命令: put 本地文件名 ftp文件名 get ftp文件名 本地文件名 mget ftp文件多个文件  注意使用该命令时先用 lcd切换本地路径 还有一些常用的  ls mkdir 等,参考 ...

  6. python中的多态

    # -*- coding: cp936 -*- #python 27 #xiaodeng #python中的多态 #多态:一个操作的意义取决于被操作对象的类型,相同的消息给予不同的对象会引发不同的动作 ...

  7. Windows下如何配置tomcat环境变量

    Apache Tomcat 是一款 Java Servlet 和 JavaServer Pages 技术的开源软件实现,可以作为测试 Servlet 的独立服务器,而且可以集成到 Apache Web ...

  8. IP欺骗:要虚拟很多IP的情况:在一台机上虚拟的IP跨网段的处理,可通过在服务器端添加路由来实现

    要虚拟很多IP的情况:在一台机上虚拟的IP跨网段的处理,可通过在服务器端添加路由来实现. 例: [服务器] IP:192.168.0.1 [测试机] IP:192.168.0.2 测试机上添加的虚拟 ...

  9. iOS-自定义起始时间选择器视图

    概述 自定义起始时间选择器视图, 调起时间选择器, 传值(起始时间/截止时间), 两者时间均要合理, 不能超过未来时间, 并且起始时间不能大于截止时间. 点击取消或空白处收起时间选择器. 详细 代码下 ...

  10. JavaScript-实现滚动条

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...