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