/* 随机数引擎:
* 有状态的随机数发生器,生成在预定义的最大小值之间的随机数
* 不是真正的随机数--伪随机
*/
int main ()
{
std::default_random_engine eng;
cout << "Min: " << eng.min() << endl;
cout << "Max: " << eng.max() << endl; cout << eng() << endl; // 生成一个随机数
cout << eng() << endl; // 生成第二个随机数 std::stringstream state;
state << eng; // 保存引擎状态 cout << eng() << endl; // 生成一个随机数
cout << eng() << endl; // 生成第二个随机数 state >> eng; // 恢复引擎状态
cout << eng() << endl; // 生成一个随机数,跟前面的值一模一样
cout << eng() << endl; // 生成第二个随机数,跟前面的值一模一样
} /* 更多例子 */
void printRandom(std::default_random_engine e) {
for (int i=0; i<10; i++)
cout << e() << " ";
cout << endl;
} template <typename T>
void printArray(T arr) {
for (auto v:arr) {
cout << v << " ";
}
cout << endl;
} int main ()
{
std::default_random_engine eng;
printRandom(eng); std::default_random_engine eng2;
printRandom(eng2); //值跟前面完全一样,所以引入种子 unsigned seed = std::chrono::steady_clock::now().time_since_epoch().count();
std::default_random_engine e3(seed); //
printRandom(e3); eng.seed(); // 重置引擎为初始状态
eng.seed(109); // 依据种子109设置引擎状态 eng2.seed(109);
if (eng == eng2) // 两个引擎状态相同就相同
cout << "eng and eng2 have the same state" << endl; cout << "\n\n Shuffling:" << endl;
int arr[] = {1,2,3,4,5,6,7,8,9};
vector<int> d(arr, arr+9);
printArray(d); vector<int> d = {1,2,3,4,5,6,7,8,9};
std::shuffle(d.begin(), d.end(), std::default_random_engine());
printArray(d);
std::shuffle(d.begin(), d.end(), std::default_random_engine()); // 相同顺序
printArray(d); std::shuffle(d.begin(), d.end(), eng);
printArray(d);
std::shuffle(d.begin(), d.end(), eng); // 不同顺序
printArray(d);
} /* 其他随机数引擎 参看cplusplus.com*/ /* 随机数分布 */
// 默认的引擎都是均匀分布,且取值范围固定 int main () {
// 引擎只是提供了一个随机源
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
std::default_random_engine e(seed);
// 如何获取一个0到5之间的随机数?
// e()%6
// -- 随机性差
// -- 只能均匀分布 std::uniform_int_distribution<int> distr(0,5); // range: [0,5] -- 0和5都包含,这个唯一一个全闭区间的特例
// 默认参数: [0, INT_MAX]
cout << " int_distribution: " << endl;
for (int i=0; i<30; i++) {
cout << distr(e) << " ";
} cout << "\n\n real_distribution: " << endl; std::uniform_real_distribution<double> distrReal(0,5); // 半开区间: [1, 5)
// default param: [0, 1)
for (int i=0; i<30; i++) {
cout << distrReal(e) << " ";
} cout << " poisson_distribution: " << endl;
std::poisson_distribution<int> distrP(1.0); // mean (double)
for (int i=0; i<30; i++) {
cout << distrP(e) << " ";
}
cout << endl; cout << " normal_distribution: " << endl;
std::normal_distribution<double> distrN(10.0, 3.0); // 平均值和标准差
vector<int> v(20);
for (int i=0; i<800; i++) {
int num = distrN(e); // convert double to int
if (num >= 0 && num < 20)
v[num]++; // v[num] 记录数字num出现的次数
}
for (int i=0; i<20; i++) {
cout << i << ": " << std::string(v[i], '*') << endl;
}
cout << endl; // Stop using rand()%n;
} /* 其他分布参看cplusplus.com*/

C++11--随机数引擎和随机数分布<random>的更多相关文章

  1. 【C++】随机数引擎

    rand() 基本:使用随机数时,经常见到的是C标准库提供的函数rand(),这个函数会生成一个0到RAND_MAX之间的一个整形数: 分布:为了得到一个给定范围内的随机数,通常会对生成的随机数取余: ...

  2. C/C++基础----随机数分布和随机数引擎

    随机数分布 除了伯努利分布,其他都是模板,接收单个类型参数,指出分布生成的结果类型. 表示分布生成浮点数,float.double或long double 表示要求一个整型类型,不包括bool或任何c ...

  3. C++随机数引擎

    C++的随机数引擎有以下几个要点需要注意:  1.随机数发生器使用同一种子会生成相同序列的随机数序列 2.为了让程序每次运行都会生成不同的随机结果,我们可以使用 time(0) 产生一个随机数种子 3 ...

  4. js进阶解决浏览器缓存不能自动更新的问题(在ajax的url上带上一个参数,可以是日期,或者是随机数)(随机数Math.random)(取得日期的毫秒数:new Date().getTime();)

    js进阶解决浏览器缓存不能自动更新的问题(在ajax的url上带上一个参数,可以是日期,或者是随机数)(随机数Math.random)(取得日期的毫秒数:new Date().getTime();) ...

  5. 《java入门第一季》之HashSet小案例:获取10个1至20的随机数,要求随机数不能重复

    这是基于HashSet集合的唯一性. /*  * 编写一个程序,获取10个1至20的随机数,要求随机数不能重复.  *   * 分析:  * A:创建随机数对象  * B:创建一个HashSet集合 ...

  6. java随机生成6位随机数 5位随机数 4位随机数

    随机数,应用会相当广,验证数,订单号,流水号拼接. 下面是java随机数生成语句: 生成6位随机数(不会是5位或者7位,仅只有6位): System.+)*)); 同理,生成5位随机数: System ...

  7. 【概率论】3-1:随机变量和分布(Random Variables and Discrete Distributions)

    title: [概率论]3-1:随机变量和分布(Random Variables and Discrete Distributions) categories: Mathematic Probabil ...

  8. 【转】linux shell实现随机数多种方法(date,random,uuid)

    在日常生活中,随机数实际上经常遇到,想丢骰子,抓阄,还有抽签.呵呵,非常简单就可以实现.那么在做程序设计,真的要通过自己程序设计出随机数那还真的不简单了.现在很多都是操作系统内核会提供相应的api,这 ...

  9. js生成[n,m]的随机数,js如何生成随机数,javascript随机数Math.random()

    一.预备知识 Math.ceil();  //向上取整. Math.floor();  //向下取整. Math.round();  //四舍五入. Math.random();  //0.0 ~ 1 ...

随机推荐

  1. 二叉树求逆序对(伪AC 23333)

    成链的时候 是最坏情况 O(n^2)的复杂度呢! 按照输入的数据 一个一个的插入建树 然后维护左右儿子的个数  (我们规定, 左儿子 小于  父亲  右儿子大于父亲) 往左走 说明存在逆序对 逆序对的 ...

  2. Xlua使用教程、攻略

    Xlua 使用指南 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享.心创新! ...

  3. jQuery事件委托方法 bind live delegate on

    1.bind    jquery 1.3之前 定义和用法:主要用于给选择到的元素上绑定特定事件类型的监听函数 语法:  bind(type,[data],function(e)); 特点: a.适合页 ...

  4. 《DSP using MATLAB》Problem 6.7

    代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...

  5. 逍遥大佬分享mysql知识

    设计表规则: 0),数据库名字以db_开始,编码UTF8 1),表名都以tb_开始 2),字段都是用小写,比如是否删除is_delete 3),表都是innodb,utf8格式的 4),最重要的,表名 ...

  6. Go Example--原子计数器

    package main import ( "fmt" "runtime" "sync/atomic" "time" ) ...

  7. 【JVM】java对象

    一.对象内存布局 对象在内存中存储可分为3块区域:对象头,实例数据,对齐填充 1.对象头 对象头包含两部分内容. 第一部分:存储对象自身的运行时数据,哈希吗(hashCode),GC分代年龄,锁状态标 ...

  8. LG3978 【[TJOI2015]概率论】

    前置:卡特兰数 记\(C_n\)为\(n\)个节点的二叉树的个数,\(C_0=1\),对于\(n \geq 1\),取一个根节点,枚举其左子树大小,有 \[C_n=\sum_{i=0}^{n-1}C_ ...

  9. PyMongo 常见问题

    PyMongo是线程安全的吗PyMongo是线程安全的,并且为多线程应用提供了内置的连接池 PyMongo是进程安全的吗PyMongo不是进程安全的,如果你在fork()中使用MongoClient实 ...

  10. Centos7禁止或者允许开机启动服务

    [root@bogon rsyslog.d]# systemctl is-enabled httpd disabled [root@bogon rsyslog.d]# systemctl status ...