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();
}
我有 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();
}