«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как генерировать случайные числа, суммирующиеся с заранее определенным значением с равной вероятностью?

Как генерировать случайные числа, суммирующиеся с заранее определенным значением с равной вероятностью?

Опубликовано 8 ноября 2024 г.
Просматривать:656

How to Generate Random Numbers Summing to a Predefined Value with Equal Probability?

Генерация случайных чисел, суммирующихся с предопределенным значением

В этом контексте мы стремимся создать список псевдослучайных чисел, которые в совокупности складываются до определенного заранее заданного значения. Один метод включает в себя случайное генерирование числа в заданном диапазоне, вычитание его из общей суммы и повторение этого процесса до тех пор, пока сумма не станет равной желаемому значению. Однако этот подход отдает предпочтение первому сгенерированному числу с точки зрения его вклада в сумму.

Для обеспечения единообразия было разработано более сложное решение:

import random

def constrained_sum_sample_pos(n, total):
    """Return a randomly chosen list of n positive integers summing to total.
    Each such list is equally likely to occur."""

    dividers = sorted(random.sample(range(1, total), n - 1))
    return [a - b for a, b in zip(dividers   [total], [0]   dividers)]

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

Например, если мы установим n равным 4, а общее количество — 40, мы можем получить следующий результат: [4, 4, 25 , 7]. Важно отметить, что каждый элемент этого списка при суммировании дает предопределенное значение 40.

Чтобы разрешить использование неположительных целых чисел, доступна модификация:

def constrained_sum_sample_nonneg(n, total):
    """Return a randomly chosen list of n nonnegative integers summing to total.
    Each such list is equally likely to occur."""

    return [x - 1 for x in constrained_sum_sample_pos(n, total   n)]

Увеличивая каждое значение на единицу, мы можем сгенерировать список неотрицательных целых чисел, которые в сумме дают желаемую сумму.

Этот метод гарантирует, что каждая возможная комбинация, независимо от того, являются ли числа положительными или неотрицательными, имеет равную вероятность создания. Благодаря удобной реализации и универсальности в различных сценариях, constrained_sum_sample_pos и constrained_sum_sample_nonneg стали неотъемлемой частью задач генерации случайных чисел в Python.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3