c++11 生成随机数

一、为什么需要随机数?

	仿真过程中需要输入自变量得到输出结果。一般来说,如果在定义域中通过枚举的方式选取自变量,仿真所需			
要的时间会很长。如果选取特定的点作为自变量,程序或数学模型的正确性无法得到保证。如果随机选取一定数量
的自变量,仿真所需时间可以依选取的自变量数目而定,仿真的结果能够反映一般情况下的结果。

二、c++11能够生成哪些类型的随机数?

	c++11提供均匀分布、伯努利分布、泊松分布、正态分布、抽样分布的随机数列。

三、怎样生成随机数?

3.1 c++11生成随机数需要什么?

	在c++11中生成随机数需要用到随机数引擎类和随机数分布类。随机数引擎类生成一个无符号随机数序列。随机数
分布类使用随机数引擎类输出的无符号序列通过一种特定的对应关系生成指定类型的随机数。
	简而言之,在c++11中随机数分布类和随机数引擎类组合产生各种类型随机数。

3.2 c++11中生成随机数序列的具体步骤

#include <iostream>
#include <random>
int main()
{
	//定义随机数引擎类对象
	std::default_random_engine e;
	//定义随机数分布类对象
	std::uniform_real_distribution<double> u(0,1);
	for(int idx = 0; idx < 10 ; idx++)
	{
		std::cout << "idx = "<<idx<<" randNum= " << u(e) << std::endl;
	}
}

3.2 c++11生成随机数时可能遇到的问题、出现问题的原因及解决方法?

	1.希望在调用有随机数生成的函数时生成不同的随机数,但生成相同的随机数?
	#include <iostream>
	#include <random>
	void rand1(void);
	int main()
	{
		rand1();
		rand1();
	}
	void rand1(void)
	{
		//定义随机数引擎类对象
		std::default_random_engine e;
		//定义随机数分布类对象
		std::uniform_real_distribution<double> u(0,1);
		for(int idx = 0; idx < 10 ; idx++)
		{
			std::cout << "idx = "<<idx<<" randNum= " << u(e) << std::endl;
		}
	}
			
	输出结果如下:
	idx = 0 randNum= 0.131538
	idx = 1 randNum= 0.45865
	idx = 2 randNum= 0.218959
	idx = 3 randNum= 0.678865
	idx = 4 randNum= 0.934693
	idx = 5 randNum= 0.519416
	idx = 6 randNum= 0.0345721
	idx = 7 randNum= 0.5297
	idx = 8 randNum= 0.00769819
	idx = 9 randNum= 0.0668422
	idx = 0 randNum= 0.131538
	idx = 1 randNum= 0.45865
	idx = 2 randNum= 0.218959
	idx = 3 randNum= 0.678865
	idx = 4 randNum= 0.934693
	idx = 5 randNum= 0.519416
	idx = 6 randNum= 0.0345721
	idx = 7 randNum= 0.5297
	idx = 8 randNum= 0.00769819
	idx = 9 randNum= 0.0668422

	多次调用函数产生同样随机数的原因是随机数引擎对象初始化的状态不变。解决方法是将随机数引擎对象设为静态变量。
	#include <iostream>
	#include <random>
	void rand1(void);
	void rand2(void);
	int main()
	{
		rand2();
		rand2();
	}
	void rand1(void)
	{
		//定义随机数引擎类对象
		std::default_random_engine e;
		//定义随机数分布类对象
		std::uniform_real_distribution<double> u(0,1);
		for(int idx = 0; idx < 10 ; idx++)
		{
			std::cout << "idx = "<<idx<<" randNum= " << u(e) << std::endl;
		}
	}
	void rand2(void)
	{
		//定义随机数引擎类对象
		static std::default_random_engine e;
		//定义随机数分布类对象
		std::uniform_real_distribution<double> u(0,1);
		for(int idx = 0; idx < 10 ; idx++)
		{
			std::cout << "idx = "<<idx<<" randNum= " << u(e) << std::endl;
		}
	}
	输出结果如下:
	idx = 0 randNum= 0.131538
	idx = 1 randNum= 0.45865
	idx = 2 randNum= 0.218959
	idx = 3 randNum= 0.678865
	idx = 4 randNum= 0.934693
	idx = 5 randNum= 0.519416
	idx = 6 randNum= 0.0345721
	idx = 7 randNum= 0.5297
	idx = 8 randNum= 0.00769819
	idx = 9 randNum= 0.0668422
	idx = 0 randNum= 0.686773
	idx = 1 randNum= 0.930436
	idx = 2 randNum= 0.526929
	idx = 3 randNum= 0.653919
	idx = 4 randNum= 0.701191
	idx = 5 randNum= 0.762198
	idx = 6 randNum= 0.0474645
	idx = 7 randNum= 0.328234
	idx = 8 randNum= 0.75641
	idx = 9 randNum= 0.365339
	2.希望在调用有随机数生成的函数时生成相同的随机数,但生成不相同的随机数?
	
	#include <iostream>
	#include <random>
	void rand1(void);
	void rand2(void);
	int main()
	{
		rand2();
		rand2();
	}
	void rand1(void)
	{
		//定义随机数引擎类对象
		std::default_random_engine e;
		//定义随机数分布类对象
		std::uniform_real_distribution<double> u(0,1);
		for(int idx = 0; idx < 10 ; idx++)
		{
			std::cout << "idx = "<<idx<<" randNum= " << u(e) << std::endl;
		}
	}
	void rand2(void)
	{
		//定义随机数引擎类对象
		static std::default_random_engine e;
		//定义随机数分布类对象
		std::uniform_real_distribution<double> u(0,1);
		for(int idx = 0; idx < 10 ; idx++)
		{
			std::cout << "idx = "<<idx<<" randNum= " << u(e) << std::endl;
		}
	}
	输出结果如下:
	idx = 0 randNum= 0.131538
	idx = 1 randNum= 0.45865
	idx = 2 randNum= 0.218959
	idx = 3 randNum= 0.678865
	idx = 4 randNum= 0.934693
	idx = 5 randNum= 0.519416
	idx = 6 randNum= 0.0345721
	idx = 7 randNum= 0.5297
	idx = 8 randNum= 0.00769819
	idx = 9 randNum= 0.0668422
	idx = 0 randNum= 0.686773
	idx = 1 randNum= 0.930436
	idx = 2 randNum= 0.526929
	idx = 3 randNum= 0.653919
	idx = 4 randNum= 0.701191
	idx = 5 randNum= 0.762198
	idx = 6 randNum= 0.0474645
	idx = 7 randNum= 0.328234
	idx = 8 randNum= 0.75641
	idx = 9 randNum= 0.365339
	多次调用函数产生不同随机数的原因是随机数引擎内的随机数种子改变。解决方法是将随机数引擎对象的种子设为相同的种子。

	#include <iostream>
	#include <random>
	void rand1(void);
	void rand2(void);
	void rand3(void);
	int main()
	{
		rand3();
		rand3();
	}
	void rand1(void)
	{
		//定义随机数引擎类对象
		std::default_random_engine e;
		//定义随机数分布类对象
		std::uniform_real_distribution<double> u(0,1);
		for(int idx = 0; idx < 10 ; idx++)
		{
			std::cout << "idx = "<<idx<<" randNum= " << u(e) << std::endl;
		}
	}
	void rand2(void)
	{
		//定义随机数引擎类对象
		static std::default_random_engine e;
		//定义随机数分布类对象
		std::uniform_real_distribution<double> u(0,1);
		for(int idx = 0; idx < 10 ; idx++)
		{
			std::cout << "idx = "<<idx<<" randNum= " << u(e) << std::endl;
		}
	}
	void rand3(void)
	{
		//定义随机数引擎类对象
		static std::default_random_engine e;
		//定义随机数分布类对象
		std::uniform_real_distribution<double> u(0,1);
		for(int idx = 0; idx < 10 ; idx++)
		{
			e.seed(100);
			std::cout << "idx = "<<idx<<" randNum= " << u(e) << std::endl;
		}
	}
	输出结果如下:
	idx = 0 randNum= 0.153779
	idx = 1 randNum= 0.153779
	idx = 2 randNum= 0.153779
	idx = 3 randNum= 0.153779
	idx = 4 randNum= 0.153779
	idx = 5 randNum= 0.153779
	idx = 6 randNum= 0.153779
	idx = 7 randNum= 0.153779
	idx = 8 randNum= 0.153779
	idx = 9 randNum= 0.153779
	idx = 0 randNum= 0.153779
	idx = 1 randNum= 0.153779
	idx = 2 randNum= 0.153779
	idx = 3 randNum= 0.153779
	idx = 4 randNum= 0.153779
	idx = 5 randNum= 0.153779
	idx = 6 randNum= 0.153779
	idx = 7 randNum= 0.153779
	idx = 8 randNum= 0.153779
	idx = 9 randNum= 0.153779

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值