Java 中的三角分布

Triangular distribution in Java

我有 4 个零件,每个零件 10000 次,应该适合大小写,零件的尺寸由均匀、正态和三角分布给出,通过在每个分布的附加尺寸中随机生成数字。

每 4 个部分都决定它们是否适合。但这应该不是问题。

我设法以某种方式进行了统一和正态分布:

public double uniformDistrubution(double min, double max) {
    Random rand = new Random();
    return Math.random() * max + min;
}

public double normalDistrubution(double mean, double std) {
    Random rng = new Random();
    return mean + std * rng.nextGaussian();
}

但是我想不出三角形的。我有它的尺寸:

a = 7:6, b = 8:0, c = 8:4

输入代码 this Wikipedia formula,您可以使用以下内容生成三角分布:

public double triangularDistribution(double a, double b, double c) {
    double F = (c - a) / (b - a);
    double rand = Math.random();
    if (rand < F) {
        return a + Math.sqrt(rand * (b - a) * (c - a));
    } else {
        return b - Math.sqrt((1 - rand) * (b - a) * (b - c));
    }
}

附带说明一下,在您的正态分布中,您不应每次都创建一个 Random 对象:只创建一次并重复使用它。

为了补充@Tunaki 的出色回答,如果您在对称三角形中采样,您可以使用具有两个自由度的 Irwin-Hall 分布(当然然后对其进行缩放)

Link https://en.wikipedia.org/wiki/Irwin%E2%80%93Hall_distribution

代码

public double IH2() {
    return Math.random() + Math.random();
}