首页 > 其他 > 详细

随机数

时间:2021-02-24 14:02:33      阅读:23      评论:0      收藏:0      [点我收藏+]

随机数

在新标准出现之前,C和C++都依赖于一个简单的C函数rand来生成随机数。此函数生成均匀分布的伪随机整数。每个随机数的范围在0和一个系统相关的最大值(至少为32767之间)。


定义在头文件random中的随机数库通过一组协作的类来解决这些问题:随机数引擎类(random-number engines) 和随机数分布类(random-number distribution)。一个引擎类可以生成unsigned随机数序列,一个分布类使用一个引擎类生成指定类型的、在给定范围内的、服从特定概率分布的随机数。

注意:当我们说随机数发生器时,是指分布对象和引擎对象的组合。

引擎生成一个数值序列

对一个给定的发生器,每次运行程序它都会返回相同的数值序列。序列不变这一事实在调试时非常有用。但另一方面,使用随机数发生器的程序也必须考虑这一特性。

void special_1()
{
	default_random_engine e; // 生成随机无符号数
	for (size_t i = 0; i < 10; ++i)
		// e()"调用"对象生成下一个随机数 
		cout << e() << " "; 
}
void special_2()
{
	// 生成0到9之间(包含)均匀分布的随机数 
	uniform_int_distribution<unsigned> u(0, 9);
	default_random_engine e; // 生成无符号随机整数
	for (size_t i = 0; i < 10; ++i)
		// 将u作为随机数源
		// 每个调用返回在指定范围内并服从均匀分布的值 
		cout << u(e) << endl; 
}
void special_6()
{
	default_random_engine e; // 生成无符号随机整数
	// 0到1(包含)的均匀分布 
	uniform_real_distribution<double> u(0, 1);
	for (size_t i = 0; i != 10; ++i)
		cout << u(e) << " "; 
}

设置随机数发生器种子

种子就是一个数值,引擎可以利用它从序列中一个新位置重新开始生成随机数。 为引擎设置种子有两种方式:在创建引擎对象时提供种子,或者调用引擎的seed成员。

选择种子,可能最常用的是调用系统函数time。这个函数定义在头文件ctime中。它返回从一个特定时刻到当前经过了多少秒。函数time接受单个指针参数,它指向用于写入时间的数据结构。如果此指针为空,则函数简单地返回时间。

注意:由于time返回以秒计的时间,因此这种方式只适用于生成种子的间隔为秒级或更长的应用。

default_random_engine e1(time(0)); // 稍微随机些的种子

生成非均匀分布的随机数

头文件cmath中的lround函数将每个随机数舍入到最接近的整数。

void special_7()
{
	default_random_engine e; // 生成随机整数
	normal_distribution<> n(4, 1.5); // 均值4,标准差1.5
	vector<unsigned> vals(9); //9个元素均为0 
	for (size_t i = 0; i != 200; ++i)
	{
		unsigned v = lround(n(e)); // 舍入到最接近的整数 
		if (v < vals.size()) // 如果结果在范围内 
			++vals[v]; // 统计每个数出现了多少次 
	} 
	for (size_t j = 0; j != vals.size(); ++j)
		cout << j << ": " << string(vals[j], ‘*‘) << endl;
}

bernoulli_distribution 类

它是一个普通类,而非模板。此分布总是返回一个bool值。它返回true的概率是一个常数,此概率的默认值是0.5

void special_8()
{
	string resp;
	default_random_engine e; 
	bernoulli_distribution b; // 默认是50/50的机会 
	do {
		bool first = b(e); // 如果为true,则程序先行 
		cout << (first ? "We go first" : "You get to go first") << endl;
		// 传递谁先行的指示,进行游戏 
		cout << ((play(first)) ? "sorry, you lost" : "congrats, you won") << endl;
		cout << "play agin? Enter ‘yes‘ or ‘no‘" << endl;
	} while (cin >> resp && resp[0] == ‘y‘);
}

随机数

原文:https://www.cnblogs.com/ice036/p/14440657.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!