C++11--随机数引擎和随机数分布<random>
/* 随机数引擎:
 *    有状态的随机数发生器,生成在预定义的最大小值之间的随机数
 *    不是真正的随机数--伪随机
 */
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>的更多相关文章
- 【C++】随机数引擎
		
rand() 基本:使用随机数时,经常见到的是C标准库提供的函数rand(),这个函数会生成一个0到RAND_MAX之间的一个整形数: 分布:为了得到一个给定范围内的随机数,通常会对生成的随机数取余: ...
 - C/C++基础----随机数分布和随机数引擎
		
随机数分布 除了伯努利分布,其他都是模板,接收单个类型参数,指出分布生成的结果类型. 表示分布生成浮点数,float.double或long double 表示要求一个整型类型,不包括bool或任何c ...
 - C++随机数引擎
		
C++的随机数引擎有以下几个要点需要注意: 1.随机数发生器使用同一种子会生成相同序列的随机数序列 2.为了让程序每次运行都会生成不同的随机结果,我们可以使用 time(0) 产生一个随机数种子 3 ...
 - js进阶解决浏览器缓存不能自动更新的问题(在ajax的url上带上一个参数,可以是日期,或者是随机数)(随机数Math.random)(取得日期的毫秒数:new Date().getTime();)
		
js进阶解决浏览器缓存不能自动更新的问题(在ajax的url上带上一个参数,可以是日期,或者是随机数)(随机数Math.random)(取得日期的毫秒数:new Date().getTime();) ...
 - 《java入门第一季》之HashSet小案例:获取10个1至20的随机数,要求随机数不能重复
		
这是基于HashSet集合的唯一性. /* * 编写一个程序,获取10个1至20的随机数,要求随机数不能重复. * * 分析: * A:创建随机数对象 * B:创建一个HashSet集合 ...
 - java随机生成6位随机数 5位随机数 4位随机数
		
随机数,应用会相当广,验证数,订单号,流水号拼接. 下面是java随机数生成语句: 生成6位随机数(不会是5位或者7位,仅只有6位): System.+)*)); 同理,生成5位随机数: System ...
 - 【概率论】3-1:随机变量和分布(Random Variables and Discrete Distributions)
		
title: [概率论]3-1:随机变量和分布(Random Variables and Discrete Distributions) categories: Mathematic Probabil ...
 - 【转】linux shell实现随机数多种方法(date,random,uuid)
		
在日常生活中,随机数实际上经常遇到,想丢骰子,抓阄,还有抽签.呵呵,非常简单就可以实现.那么在做程序设计,真的要通过自己程序设计出随机数那还真的不简单了.现在很多都是操作系统内核会提供相应的api,这 ...
 - js生成[n,m]的随机数,js如何生成随机数,javascript随机数Math.random()
		
一.预备知识 Math.ceil(); //向上取整. Math.floor(); //向下取整. Math.round(); //四舍五入. Math.random(); //0.0 ~ 1 ...
 
随机推荐
- JavaBasic_09
			
方法的参数传递 方法调用时参数值的传递可以分为"值传递"和"引用传递"两种 值传递 - a.当方法的参数为基本数据类型时 b.实参的值被复制给形参,改变形参不会 ...
 - JetBrains PyCharm 专业版激活
			
激活码获取:http://idea.lanyus.com/ JetbrainsCrack-release-enc.jar下载:提取码为1391
 - 20155219 《Java程序设计》实验一(Java开发环境的熟悉)实验报告
			
一.实验内容及步骤 1.使用JDK编译.运行简单的java程序 先在命令行中按老师要求输入,之后编译运行,如下图. 具体代码如下: package src.shiyan1; import java.u ...
 - 洛谷 P1164:小A点菜(DP/DFS)
			
题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家--餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:"随便点". 题目描述 不过ui ...
 - [洛谷P1417 烹调方案]贪心+dp
			
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3211Dream City Time Limit: 1 Second ...
 - Go Example--if语句
			
package main import "fmt" func main() { //if else 条件都不需要括号,{}是需要的 if 7 % 2 == 0 { fmt.Prin ...
 - day07 hadoop里面的RPC框架使用
			
PS: RPC远程调用 Webservice啥的都是远程调用.下面简单介绍其使用过程 Hadoop已经实现了RPC框架,不用我们自己写,不过需要我们注意几点:1.发布服务端和客户端必须包名相同 1.服 ...
 - MySQL5.6在线DDL不锁表(在线添加字段)
			
解答你也看一下MySQL5.6在线DDL不锁表,现在我有一张1亿的表,需要增加一个字段,假如我让你去增加这个字段,你应该注意什么,具体怎么操作? 操作如下:1.注意磁盘空间(临时表目录 参数 tmpd ...
 - oracle命令导入SQL脚本
			
使用@导入 比如说我在oracle家目录下有a.sql文件 命令行sqlplus / as sysdba,进入后 SQL>@/home/oracle/a.sql; 回车搞定
 - MySQL Replication--跳过复制错误
			
在MySQL中,有两种跳过复制错误的方法:1.对于未使用GTID的复制,可以使用sql_slave_skip_counter来跳过错误2.对于使用GTID的复制,可以使用GTID_NEXT模拟空事务来 ...