高手进,c语言中如何得到服从正态分布的随机数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高手进,c语言中如何得到服从正态分布的随机数?相关的知识,希望对你有一定的参考价值。

生成大量的随机数,使之在一定的范围内(比如1~100),并且向某个值周围集中(比如30),最好能够自己设定集中程度高低

不明白的话,自己找正态分布图看看,我想要左右不对称也可以的。
第二个答案的程序是在什么编译环境里运行的?好使的话再给加分

用boost的random库方便生成,以下是2个测试,分别生成50个数:

// μ = 30, δ^2 = 4

30.84 30.00 26.61 27.49 31.27
29.74 27.99 29.81 29.73 33.29
32.17 31.37 26.83 28.20 27.99
28.69 34.66 25.44 29.22 24.84
29.39 32.02 32.35 28.28 34.16
27.04 32.02 33.40 31.39 29.08
31.91 29.19 29.14 32.25 27.20
32.16 29.06 27.67 29.26 29.51
28.36 28.65 26.87 27.74 26.56
30.16 31.18 30.57 30.57 33.43

// μ = 30, δ^2 = 100

84.66 61.85 24.17 68.63 2.15
1.30 40.92 72.74 74.83 4.25
39.86 27.06 60.94 50.58 79.35
51.83 86.03 74.75 92.33 70.59
93.43 55.51 57.22 70.48 70.52
1.45 22.55 40.85 33.23 65.39
35.54 89.69 45.87 88.35 40.73
67.31 17.64 23.98 98.43 35.93
97.88 48.95 59.54 13.14 45.79
5.55 8.77 70.31 14.83 82.54

#include <iostream>
#include <boost/random.hpp>
using namespace std;

typedef boost::minstd_rand GenType;
typedef boost::normal_distribution<> NormalDis;
typedef boost::variate_generator<GenType&, NormalDis> RNG;

void Show(RNG& rng)

cout.setf(ios_base::fixed);
cout.precision(2);
for(int i = 0; i < 50;)

double temp = rng();
if(temp >= 1 && temp <= 100)

cout << temp << ' ';
if(++i % 5 == 0)
cout << '\n';

else
continue;

cout << endl;


int main()

GenType gt;
NormalDis dis(30, 2); // μ = 30, δ^2 = 4
RNG rng(gt, dis);
Show(rng);

rng.distribution() = NormalDis(30, 100); // μ = 30, δ^2 = 10000
Show(rng);
参考技术A 最好寻求专门算法
如果不行的话,也可以用大量随机数来模拟,譬如生成1000次0或1,然后求其平均数,可以得到很接近正态分布的.
如果有连续的随机函数,也可以直接求正态分部的积分函数,根据积分函数的反函数来确定位置
参考技术B 用boost的random库方便生成,以下是2个测试,分别生成50个数:
//
μ
=
30,
δ^2
=
4
30.84
30.00
26.61
27.49
31.27
29.74
27.99
29.81
29.73
33.29
32.17
31.37
26.83
28.20
27.99
28.69
34.66
25.44
29.22
24.84
29.39
32.02
32.35
28.28
34.16
27.04
32.02
33.40
31.39
29.08
31.91
29.19
29.14
32.25
27.20
32.16
29.06
27.67
29.26
29.51
28.36
28.65
26.87
27.74
26.56
30.16
31.18
30.57
30.57
33.43
//
μ
=
30,
δ^2
=
100
84.66
61.85
24.17
68.63
2.15
1.30
40.92
72.74
74.83
4.25
39.86
27.06
60.94
50.58
79.35
51.83
86.03
74.75
92.33
70.59
93.43
55.51
57.22
70.48
70.52
1.45
22.55
40.85
33.23
65.39
35.54
89.69
45.87
88.35
40.73
67.31
17.64
23.98
98.43
35.93
97.88
48.95
59.54
13.14
45.79
5.55
8.77
70.31
14.83
82.54
#include
<iostream>
#include
<boost/random.hpp>
using
namespace
std;
typedef
boost::minstd_rand
GenType;
typedef
boost::normal_distribution<>
NormalDis;
typedef
boost::variate_generator<GenType&,
NormalDis>
RNG;
void
Show(RNG&
rng)

cout.setf(ios_base::fixed);
cout.precision(2);
for(int
i
=
0;
i
<
50;)

double
temp
=
rng();
if(temp
>=
1
&&
temp
<=
100)

cout
<<
temp
<<
'
';
if(++i
%
5
==
0)
cout
<<
'\n';

else
continue;

cout
<<
endl;

int
main()

GenType
gt;
NormalDis
dis(30,
2);
//
μ
=
30,
δ^2
=
4
RNG
rng(gt,
dis);
Show(rng);
rng.distribution()
=
NormalDis(30,
100);
//
μ
=
30,
δ^2
=
10000
Show(rng);
参考技术C 正态分布没有啥技术难度,就是高斯??都毕业了好久了我都忘了。可以设定它的不同的参数就可以调节它的分布情况。
如果有需要的话,把高斯的那个正态分布的那个公式给我说一下。我帮你编

以上是关于高手进,c语言中如何得到服从正态分布的随机数?的主要内容,如果未能解决你的问题,请参考以下文章

matlab中已知一组数据服从正态分布,怎么求均值和方差?

应用统计学简单随机抽样的区间估计和样本容量的确定

应用统计学简单随机抽样的区间估计和样本容量的确定

应用统计学简单随机抽样的区间估计和样本容量的确定

应用统计学简单随机抽样的区间估计和样本容量的确定

R语言程序