因为阿里的实习生笔试遇到类似题目,整理一下产生随机数的实现方法。
首先需要一个参数化的引擎类型,可以使用default_random_engine
。参数化的引擎适配器类都是模板。
标准库还定义了一组分布模板,根据不同的概率分布生成随机数。
- 均匀分布
uniform_int_distribution< IntT> u(m,n);
uniform_real_distribution< RealT> u(x,y); - 正态分布
normal_distribution< RealT> n(m,s);
产生服从均匀分布的代码具体实现如下1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26// uniform_int_distribution
int main()
{
const int nrolls = 10000; // number of experiments
const int nstars = 95; // maximum number of stars to distribute
std::default_random_engine generator;
std::uniform_int_distribution<int> distribution(0,9);
int p[10]={};
for (int i=0; i<nrolls; ++i)
{
int number = distribution(generator);
++p[number];
}
std::cout << "uniform_int_distribution (0,9):" << std::endl;
for (int i=0; i<10; ++i)
std::cout << i << ": " << std::string(p[i]*nstars/nrolls,'*') << std::endl;
return 0;
}
1 | // uniform_real_distribution |
产生服从正态分布的代码具体实现如下1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30// normal_distribution
int main()
{
const int nrolls=10000; // number of experiments
const int nstars=100; // maximum number of stars to distribute
std::default_random_engine generator;
std::normal_distribution<double> distribution(5.0,2.0);
int p[10]={};
for (int i=0; i<nrolls; ++i)
{
double number = distribution(generator);
if ((number>=0.0)&&(number<10.0)) ++p[int(number)];
}
std::cout << "normal_distribution (5.0,2.0):" << std::endl;
for (int i=0; i<10; ++i)
{
std::cout << i << "-" << (i+1) << ": ";
std::cout << std::string(p[i]*nstars/nrolls,'*') << std::endl;
}
return 0;
}
参考文献
1.std::uniform_int_distribution
2.std::uniform_real_distribution
3.std::normal_distribution