概率论中泊松分布和高斯分布随机数生成

文章目录

  • 概率论中泊松分布和高斯分布随机数生成
      • 一、简介
      • 二、泊松分布
        • 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/

更多推荐

概率论中泊松分布和高斯分布随机数生成