Java 如何管理阵列中的概率?

Java 如何管理阵列中的概率?,java,arrays,probability,Java,Arrays,Probability,我有2个2D数组,用于存储分形的数据。我的第一个数组有3行,每行的最后一个值是概率 第1行的概率为0.33, 第2行的概率为0.33,并且 第3行的概率为0.34 现在我要做的是从0-1生成一个随机双精度。 我使用if语句来确定应该使用哪一行 以下是我的阵列: static double[][] SierpGasketMatrix = { { 0.5, 0, 0, 0.5, 0, 0, 0.33 }, //row 1

我有2个2D数组,用于存储分形的数据。我的第一个数组有3行,每行的最后一个值是概率

第1行的概率为0.33, 第2行的概率为0.33,并且 第3行的概率为0.34

现在我要做的是从0-1生成一个随机双精度。 我使用if语句来确定应该使用哪一行

以下是我的阵列:

    static double[][] SierpGasketMatrix = { { 0.5, 0, 0, 0.5, 0, 0, 0.33 }, //row 1
                                            { 0.5, 0, 0, 0.5, 0, 0.5, 0.33 }, //row 2
                                            { 0.5, 0, 0, 0.5, 0.43, 0.25, 0.34 } }; //row 3

    static double[][] BarnsleyFernMatrix = { { 0, 0, 0, 0.16, 0, 0, 0.01 }, //row 1
                                             { 0.85, 0.04, -0.04, 0.85, 0, 1.6, 0.85 }, //row 2 
                                             { 0.2, -0.26, 0.23, 0.22, 0, 1.6, 0.07 }, //row 3
                                             { -0.15, 0.28, 0.26, 0.24, 0, 0.44, 0.07 } }; //row 4
以下是确定要使用哪一行的代码:

            double randNum = Math.random();
            int row = -1;

            if (randNum < 0.33)
                row = 0;
            else if (randNum < 0.66)
                row = 1;
            else if (randNum < 1.00)
                row = 2; 
double randNum=Math.random();
int行=-1;
如果(随机数<0.33)
行=0;
否则如果(randNum<0.66)
行=1;
否则如果(随机数<1.00)
行=2;

我觉得应该有更好的方法来做到这一点。另外,我的第二个数组有4行和不同的概率,我希望对该数组使用相同的方法。

如果您想要一个通用的解决方案,只需迭代该数组,直到达到阈值。结果并不比你现在做的慢

static double[] getRandomRow(double[][] data) {
    double randNum = Math.random();
    double threshold = 0.0;
    for (double[] row : data) {
        threshold += row[row.length - 1]; // probability = last value of row
        if (threshold > randNum)
            return row;
    }
    // We should never get here, but float math is imprecise, so just return last row.
    // Could also be that input probabilities don't add to 1, so handle that if necessary.
    return data[data.length - 1];
}

如果您想要一个通用的解决方案,只需迭代数组,直到达到阈值。结果并不比你现在做的慢

static double[] getRandomRow(double[][] data) {
    double randNum = Math.random();
    double threshold = 0.0;
    for (double[] row : data) {
        threshold += row[row.length - 1]; // probability = last value of row
        if (threshold > randNum)
            return row;
    }
    // We should never get here, but float math is imprecise, so just return last row.
    // Could also be that input probabilities don't add to 1, so handle that if necessary.
    return data[data.length - 1];
}

你是否特别想要0.33、0.33和0.34,或者如果它们接近1/3,那会更好?你是否特别想要0.33、0.33和0.34,或者如果它们接近1/3,那会更好?@kaya3问题明确地说“每行的最后一个值是概率”。是否应
=
?@cybersam
=
之间的差异基本上与双打无关,但理论上
是正确的;如果第一个概率是0,并且生成的数字正好是0,那么<代码> > <代码>将选择第一行(不正确,因为概率不可能是0)。@ CysSaNo不将条件翻转到<代码>(RANNNUM <阈值)< /代码>,它读取与问题代码相同的代码。在上一次迭代中,
threshold
应该是
1.0
(除非有任何累积舍入误差),因为
randNum
也是如此,所以条件是有效的。@kaya3问题明确表示“每行的最后一个值是概率”。是否应
=
?@cybersam
=
之间的差异基本上与双打无关,但理论上
是正确的;如果第一个概率是0,并且生成的数字正好是0,那么<代码> > <代码>将选择第一行(不正确,因为概率不可能是0)。@ CysSaNo不将条件翻转到<代码>(RANNNUM <阈值)< /代码>,它读取与问题代码相同的代码。在上一次迭代中,
阈值应为
1.0
(除非存在任何累积舍入误差),因为
randNum
也是如此,所以该条件有效。