Brave

骤然临之而不惊 无故加之而不怒

  • 主页
  • 文章
  • 读书
  • 电影
  • 关于

Brave

骤然临之而不惊 无故加之而不怒

  • 主页
  • 文章
  • 读书
  • 电影
  • 关于

产生一个随机数

2017-03-07

因为阿里的实习生笔试遇到类似题目,整理一下产生随机数的实现方法。

首先需要一个参数化的引擎类型,可以使用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
#include <iostream>
#include <random>

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
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
31
32
// uniform_real_distribution
#include <iostream>
#include <random>

int main()
{

const int nrolls=10000; // number of experiments
const int nstars=95; // maximum number of stars to distribute
const int nintervals=10; // number of intervals

std::default_random_engine generator;
std::uniform_real_distribution<double> distribution(0.0,1.0);

int p[nintervals]={};

for (int i=0; i<nrolls; ++i)
{
double number = distribution(generator);
++p[int(nintervals*number)];
}

std::cout << "uniform_real_distribution (0.0,1.0):" << std::endl;
std::cout << std::fixed; std::cout.precision(1);

for (int i=0; i<nintervals; ++i)
{
std::cout << float(i)/nintervals << "-" << float(i+1)/nintervals << ": ";
std::cout << std::string(p[i]*nstars/nrolls,'*') << std::endl;
}

return 0;
}

产生服从正态分布的代码具体实现如下

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
#include <iostream>
#include <random>

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

赏

谢谢你请我吃糖果

支付宝
微信
  • C++
  • 随机数

扫一扫,分享到微信

微信分享二维码
VS中命令行参数解析——cmdline
CPP中成员对象选择操作符和成员指针选择符
© 2018 Brave
Hexo Theme Yilia by Litten