Получение N случайные числа, сумма которых является M

Я хочу получить случайные числа N, сумма которых является значением.

Например, давайте предположим, что я хочу 5 случайных чисел та сумма к 1.

Затем допустимая возможность:

0.2 0.2 0.2 0.2 0.2

Другая возможность:

0.8 0.1 0.03 0.03 0.04

И так далее. Мне нужно это для создания матрицы имущества для Нечетких C-средств.

40
задан Peter O. 18 April 2019 в 04:54
поделиться

6 ответов

Краткий ответ:

Просто сгенерируйте N случайных чисел, вычислите их сумму, разделите каждое на сумму и умножьте на M.

Более длинный ответ:

Приведенное выше решение не дает равномерное распределение, которое может быть проблемой в зависимости от того, для чего используются эти случайные числа. Другой метод, предложенный Матти Вирккуненом. :

Сгенерировать N-1 случайных чисел от 0 до 1, добавить сами числа 0 и 1 в список, отсортировать их и взять разности соседних чисел.

Я не уверен, что это дает равномерное распределение

55
ответ дан 27 November 2019 в 01:06
поделиться

Вы немного ограничены в ограничениях. Много-много процедур подойдут.

Например, нормально ли распределяются числа? Равномерно?
Я предполагаю, что все числа должны быть положительными и равномерно распределены вокруг среднего, M / N.

Попробуйте это.

  1. среднее значение = M / N.
  2. Сгенерировать N-1 значений от 0 до 2 * среднее. Это может быть стандартное число от 0 до 1, u , а случайное значение (2 * u-1) * означает создание значения в соответствующем диапазоне.
  3. Вычислить сумму значений N-1.
  4. Оставшееся значение - N-сумма.
  5. Если оставшееся значение не соответствует ограничениям (от 0 до 2 * среднее), повторите процедуру.
0
ответ дан 27 November 2019 в 01:06
поделиться
  1. Генерация случайных чисел N-1.
  2. Вычислите сумму указанных чисел.
  3. Добавьте к набору разницу между вычисленной и желаемой суммой.

Теперь у вас есть N случайных чисел, и их сумма является желаемой суммой.

1
ответ дан 27 November 2019 в 01:06
поделиться

В Java:

private static double[] randSum(int n, double m) {
    Random rand = new Random();
    double randNums[] = new double[n], sum = 0;

    for (int i = 0; i < randNums.length; i++) {
        randNums[i] = rand.nextDouble();
        sum += randNums[i];
    }

    for (int i = 0; i < randNums.length; i++) {
        randNums[i] /= sum * m;
    }

    return randNums;
}
4
ответ дан 27 November 2019 в 01:06
поделиться

Создать N-1 случайных чисел от 0 до 1, добавить в список сами числа 0 и 1, отсортировать их и взять разности соседних чисел.

42
ответ дан 27 November 2019 в 01:06
поделиться

Думаю, стоит отметить, что принятый в настоящее время ответ не дает равномерного распределения:

«Просто сгенерируйте N случайных чисел, вычислите их сумму, разделите каждое на сумма "

Чтобы убедиться в этом, давайте рассмотрим случай N = 2 и M = 1. Это тривиальный случай, поскольку мы можем сгенерировать список [x, 1-x], выбрав x равномерно в диапазоне (0,1). Предлагаемое решение генерирует пару [x / (x + y), y / (x + y)], где x и y равномерны в (0,1). Чтобы проанализировать это, мы выбираем такое z, что 0

Prob (x / (x + y)

Я сделал несколько быстрых вычислений, и оказалось, что единственное решение, которое на данный момент может приводить к равномерному распределению, было , предложенным Матти Вирккуненом :

«Сгенерировать N-1 случайных чисел от 0 до 1, добавьте сами числа 0 и 1 в список, отсортируйте их и возьмите разности соседних чисел. "

26
ответ дан 27 November 2019 в 01:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: