Maison >développement back-end >Tutoriel Python >Comment générer des nombres aléatoires avec une somme fixe et une distribution uniforme garantie ?

Comment générer des nombres aléatoires avec une somme fixe et une distribution uniforme garantie ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-27 10:50:30772parcourir

How to Generate Random Numbers with a Fixed Sum, Guaranteed Uniform Distribution?

Générer des nombres aléatoires avec une somme fixe

Le défi posé est de générer une série de nombres pseudo-aléatoires dont la somme est égale à une valeur prédéfinie . Plus précisément, comment générer quatre nombres qui, une fois additionnés, égalent 40.

Au lieu de s'appuyer sur une méthode qui pourrait biaiser la distribution du premier nombre, une approche plus uniforme est utilisée. La solution utilise une stratégie consistant à diviser la valeur prédéfinie en segments plus petits, à l'aide de diviseurs sélectionnés au hasard.

Supposons que nous ayons quatre entiers positifs aléatoires (e, f, g et h) tels que 0 < e &Lt ; f &Lt ; g &Lt ; h &Lt ; 40. Nous pouvons dériver les quatre nombres souhaités comme suit :

a = e
b = f - e
c = g - f
d = 40 - g

Cette technique garantit une probabilité égale pour chaque ensemble de nombres, assurant une distribution uniforme. Les nombres aléatoires résultants répondent à l'exigence de somme à la valeur prédéfinie.

En étendant ce concept, la fonction Python suivante génère une liste aléatoire d'entiers positifs totalisant un total spécifié :

<code class="python">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)]</code>

Pour générer des entiers non négatifs, une transformation supplémentaire est utilisée :

<code class="python">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)]</code>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn