1 指数分布
指数分布的概率密度函数:y=lamda*exp(-lamda*x)
x>=0
由此可以计算概率分布函数:y=1-exp(-lamda*x)
x>=0
y是 X
首先,把y当作是在(0,1)区间的均匀分布的随机变量。
然后,求y=1-exp(-lamda*x)的逆函数,x=-(1/lamda)*ln(1-y)
令z=1-y,显然z也是(0,1)区间的均匀分布的随机变量,于是就有x=-(1/lamda)*ln(z)。
z可以通过(double)
rand() / RAND_MAX计算。原因是rand() 是随机分布函数。
最终满足指数分布的变量x,就可以通过x=-(1/lamda)*ln(z)计算。
import
java.util.*;
public class zhishu
{
public
static void main(String[] args) {
double x,
z;
double
lamda;
System.out.println("请输入lamda的值:");
Scanner
scanner = new Scanner(System.in);
lamda =
scanner.nextDouble();
for(int i=0;
i<10; i++) {
z =
Math.random();
x = -(1 /
lamda) * Math.log(z);
System.out.println(x);
}
}
}
----------------------------------------------------------------------
2
正态分布
java.util.Random里的nextGaussian(),生成的数值符合均值为0方差为1的高斯/正态分布,即符合标准正态分布。
产生数字的范围:任何数都有可能,不过在0左右的数字较多。
产生N(a,b)的数:Math.sqrt(b)*random.nextGaussian()+a; 即均值为a,方差为b的随机数
--------------------------------------------------------------------------------------
3 扩展:使用[0,1]之间的均匀分布生成任意一个分布函数的随机数序列
任务:给定一个分布的密度函数f(x),要生成满足这一分布的一组随机数。
输入:一组[0,1]之间的满足均匀分布的随机数U
输出:一组满足f(x)的随机数V
方法:1)求f(x)的分布函数F(x)
2)求F(x)的反函数F'(x)
3)对于U中的每一个元素u,将F'(u)加入序列V中。
4 其他:colt库中有随机数发生器
cern.jet.random.Distributions
Method Summary
static double
k,
double p) Returns
the probability distribution function of the discrete geometric
distribution.
static double
r,
int nr, RandomEngine randomGenerator) Returns
a random number from the Burr II, VII, VIII, X Distributions.
static double
r,
double k,
int nr, RandomEngine randomGenerator) Returns
a random number from the Burr III, IV, V, VI, IX, XII
distributions.
static double
Returns
a cauchy distributed random number from the standard Cauchy
distribution C(0,1).
static double
variance,
double mean, RandomEngine randomGenerator) Returns
an erlang distributed random number with the given variance and
mean.
static int
p, RandomEngine randomGenerator) Returns
a discrete geometric distributed random
number;
static double
l3,
double l4, RandomEngine randomGenerator) Returns
a lambda distributed random number with parameters l3 and l4.
static double
Returns
a Laplace (Double Exponential) distributed random number from the
standard Laplace distribution L(0,1).
static double
Returns
a random number from the standard Logistic distribution
Log(0,1).
static double
alpha,
double cut, RandomEngine randomGenerator) Returns
a power-law distributed random number with the given exponent and
lower cutoff.
static double
Returns
a random number from the standard Triangular distribution in
(-1,1).
static double
alpha,
double beta, RandomEngine randomGenerator) Returns
a weibull distributed random number.
static int
z, RandomEngine randomGenerator) Returns
a zipfian distributed random number with the given skew.