概率论中泊松分布和高斯分布随机数生成
文章目录
- 概率论中泊松分布和高斯分布随机数生成
- 一、简介
- 二、泊松分布
- 2.1 添加maven依赖
- 2.2 泊松分布随机数生成
- 三、高斯分布
- 3.1 高斯分布随机数生成
- 四、备注
一、简介
这里介绍概率论中泊松分布和高斯分布(正太分布)在随机数中的生成及应用示例,抛砖引玉,让大家关注概率论在实际中的应用,包括满足特定条件(如均值在特定值)的随机数生成、满足特定工式对应曲线的应用场景(如对某事件随时间自然降低关注度)。本文不涉及数学工式,相关内容请查看相关课本。
二、泊松分布
泊松分布是离散的随机分布,期望和方差均为同一值。特点是事件相互独立,发生概率一样。在随机数应用中,我们可以根据需要生成期望是指定值的随机数据,用于离散生成均值为期望的随机数。在应用中生成方式如下:
2.1 添加maven依赖
<dependency>
<groupId>org.uncommons.maths</groupId>
<artifactId>uncommons-maths</artifactId>
<version>1.2.1</version>
</dependency>
2.2 泊松分布随机数生成
package com.dragon.study.algorithm.poisson;
import org.uncommons.maths.number.AdjustableNumberGenerator;
import org.uncommons.maths.number.NumberGenerator;
import org.uncommons.maths.random.MersenneTwisterRNG;
import org.uncommons.maths.random.PoissonGenerator;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class PoissonAlgorithm {
/**
* 泊松分布随机数生成器, 事件独立,发生概率一样
* @param mean 均值,即期望值
* @return
*/
public static NumberGenerator<Integer> poissonGenerator(double mean){
Random rng = new MersenneTwisterRNG();
NumberGenerator<Integer> generator = new PoissonGenerator(new AdjustableNumberGenerator<>(mean), rng);
return generator;
}
//泊松随机数生成器测试
public static void testPoisson(){
//期望为10的随机数生成
double mean = 10;
NumberGenerator gen = poissonGenerator(mean);
List<Integer> list = Stream.generate(()->gen.nextValue().intValue()).limit(15).collect(Collectors.toList());
double avg = list.stream().mapToDouble(Integer::doubleValue).average().getAsDouble();
System.out.printf("poissonGenerator, avg:%.2f mean:%.2f list:%s \n", avg, mean, list); //tenAvg:9.90 expect:10.00 tenList:[12, 9, 15, 12, 9, 10, 10, 7, 9, 6]
}
public static void main(String[] args) {
//泊松随机数生成器测试
testPoisson();
}
}
这里运行2次,上面输出分别如下:
//第一次输出
poissonGenerator, avg:10.40 mean:10.00 list:[12, 13, 18, 13, 6, 13, 11, 8, 4, 2, 12, 6, 15, 11, 12]
//第二次输出
poissonGenerator, avg:9.73 mean:10.00 list:[12, 4, 12, 12, 8, 8, 11, 12, 13, 12, 7, 13, 10, 5, 7]
可以发现,随机数的平均值靠近于设定的期望值。
三、高斯分布
高斯分布也叫正太分布,当期望为0,方差为1时,即是标准正太分布。其图形中间高两头低,左右对称。依赖同前一样。
3.1 高斯分布随机数生成
package com.dragon.study.algorithm.poisson;
import org.uncommons.maths.number.AdjustableNumberGenerator;
import org.uncommons.maths.number.NumberGenerator;
import org.uncommons.maths.random.GaussianGenerator;
import org.uncommons.maths.random.MersenneTwisterRNG;
import org.uncommons.maths.random.PoissonGenerator;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class GaussianAlgorithm {
/**
* 高斯分布(正太分布)随机数生成器, 图形中间高两头低,左右对称, 当μ = 0,σ = 1时的正态分布是标准正态分布
* @param mean 均值,即期望值,确定图形对称点(最高点)在x轴位置
* @param standardDeviation 方差, 值越大,图形越扁平
* @return
*/
public static NumberGenerator<Double> gaussianGenerator(double mean, double standardDeviation){
Random rng = new MersenneTwisterRNG();
NumberGenerator<Double> generator = new GaussianGenerator(new AdjustableNumberGenerator<>(mean), new AdjustableNumberGenerator<>(standardDeviation), rng);
return generator;
}
//高斯分布(正太分布)随机数生成器测试
public static void testGaussian(){
double mean = 10;
double standardDeviation = 2;
NumberGenerator gen = gaussianGenerator(mean, standardDeviation);
List<Integer> list = Stream.generate(()->gen.nextValue().intValue()).limit(15).collect(Collectors.toList());
double avg = list.stream().mapToDouble(Integer::doubleValue).average().getAsDouble();
System.out.printf("gaussianGenerator, avg:%.2f mean:%.2f list:%s \n", avg, mean, list); //tenAvg:9.90 expect:10.00 tenList:[12, 9, 15, 12, 9, 10, 10, 7, 9, 6]
}
public static void main(String[] args) {
//高斯随机数生成器测试
testGaussian();
}
}
四、备注
这里另外分享两个在线数学工具,用于绘图和计算。
数学绘图:https://www.geogebra/graphing
数学计算及对应图形显示:https://www.wolframalpha/
更多推荐
概率论中泊松分布和高斯分布随机数生成
发布评论