Maison  >  Article  >  développement back-end  >  Comment générer des nombres aléatoires totalisant une valeur prédéfinie avec une probabilité égale ?

Comment générer des nombres aléatoires totalisant une valeur prédéfinie avec une probabilité égale ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-27 05:14:02197parcourir

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

Génération de nombres aléatoires totalisant une valeur prédéfinie

Dans ce contexte, nous visons à générer une liste de nombres pseudo-aléatoires qui s'ajoutent collectivement jusqu'à une valeur prédéterminée spécifique. Une méthode consiste à générer aléatoirement un nombre dans une plage spécifiée, à le soustraire du total et à répéter ce processus jusqu'à ce que la somme soit égale à la valeur souhaitée. Cependant, cette approche privilégie le premier nombre généré en termes de sa contribution à la somme.

Pour assurer l'uniformité, une solution plus sophistiquée a été développée :

<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>

Cette méthode génère une liste d'entiers positifs dont la somme correspond à la valeur cible. Le concept clé est que chaque combinaison possible de nombres a la même probabilité d’être générée. De plus, étendre cette technique à différents totaux et à différents nombres de nombres aléatoires est simple.

Par exemple, si nous définissons n sur 4 et totalisons 40, nous pourrions obtenir le résultat suivant : [4, 4, 25 , 7]. Il est important de noter que chaque élément de cette liste, une fois additionné, produit la valeur prédéfinie de 40.

Pour permettre les entiers non positifs, une modification est disponible :

<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>

Par en incrémentant chaque valeur de un, nous pouvons générer une liste d'entiers non négatifs qui totalisent le total souhaité.

Cette méthode garantit que toutes les combinaisons possibles, que les nombres soient positifs ou non négatifs, a une probabilité égale d’être généré. Grâce à sa mise en œuvre conviviale et à sa polyvalence dans différents scénarios, constrained_sum_sample_pos et constrained_sum_sample_nonneg font désormais partie intégrante des tâches de génération de nombres aléatoires en Python.

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