一、功能
产生 ( a , b ) (a,b) (a,b)区间上均匀分布的随机数
二、原理
均匀分布的概率密度函数为:
f
(
x
)
=
{
1
b
−
a
,
a
⩽
x
⩽
b
0
,
o
t
h
e
r
c
a
s
e
f(x)=\begin{cases} \frac{1}{b-a}& , \mathrm{a}\leqslant x\leqslant b\\ 0& , othercase\\ \end{cases}
f(x)={b−a10,a⩽x⩽b,othercase
通常用
U
(
a
,
b
)
U(a,b)
U(a,b)表示。均匀分布的均值为
a
+
b
2
\frac{a+b}{2}
2a+b,方差为
(
a
−
b
)
2
12
\frac{\left( a-b \right) ^2}{12}
12(a−b)2。
产生均匀分布随机数的方法如下:
首先,由给定的初值
x
0
x_0
x0,用混合同余法,
{
x
i
=
(
a
x
i
−
1
+
c
)
(
m
o
d
M
)
y
i
=
x
i
/
M
\left\{ \begin{aligned} &x_i=\left( ax_{i-1}+c \right) \left( \mathrm{mod} M \right)\\ &y_i=x_i/M\\ \end{aligned} \right.
{xi=(axi−1+c)(modM)yi=xi/M
产生
(
0
,
1
)
(0,1)
(0,1)区间上的随机数
y
i
y_i
yi。其中:
a
=
2045
a=2045
a=2045,
c
=
1
c=1
c=1,
M
=
2
20
M=2^{20}
M=220;然后通过变换
z
i
=
a
+
(
b
−
a
)
y
i
z_i=a+(b-a)y_i
zi=a+(b−a)yi产生
(
a
,
b
)
(a,b)
(a,b)区间上的随机数
z
i
z_i
zi。
三、程序
3.1 dsp.h头文件函数声明
#pragma once
#ifndef __HEAD_H__
#define __HEAD_H__
#include <math.h>
#include <string.h>
double uniform(double a, double b, long int* seed); // 均匀分布的随机数
3.2 dsp.c源文件函数定义
#include <math.h>
#include <string.h>
#include "dsp.h"
double uniform(double a, double b, long int* seed) {
double t;
*seed = 2045 * (*seed) + 1;
*seed = *seed - (*seed / 1048576) * 1048576;
t = (*seed) / 1048576.0;
t = a + (b - a) * t;
return t;
}
3.3 main.c中函数调用
#include <stdio.h>
#include "dsp.h"
int main()
{
double uniform(double a, double b, long int* seed);
double a = 0.0, b = 1.0, x;
long int s = 13579;
for (int i = 0; i < 10; i++){
for (int j = 0; j < 5; j++) {
x = uniform(a, b, &s);
printf("%13.7f", x);
}
printf("\n");
}
}