Как управлять вероятностями в массиве? - PullRequest
0 голосов
/ 15 января 2020

У меня есть 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; 

Мне кажется, что должен быть лучший способ сделать это. Кроме того, мой второй массив имеет 4 строки и разные вероятности, и я хотел бы использовать тот же метод для этого массива.

1 Ответ

2 голосов
/ 15 января 2020

Если вы хотите общее решение, просто итерируйте массив, пока не достигнете порога. Результат не намного медленнее, чем то, что вы делаете.

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];
}
...