Maison >développement back-end >Tutoriel Python >Comment générer des nombres aléatoires avec une somme prédéfinie et assurer une distribution de probabilité égale ?

Comment générer des nombres aléatoires avec une somme prédéfinie et assurer une distribution de probabilité égale ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-31 16:22:47189parcourir

How to Generate Random Numbers with a Predefined Sum and Ensure an Equal Probability Distribution?

Générer des nombres aléatoires avec une somme prédéfinie

Introduction : distribution de probabilité égale

Générer des nombres aléatoires pour résumer une valeur prédéterminée pose un défi intéressant en programmation informatique. Même si des approches simples peuvent sembler suffisantes, elles introduisent souvent des biais, dans la mesure où certains chiffres ont plus de chances d'être sélectionnés. Cet article examine une solution raffinée qui garantit une distribution de probabilité égale pour toutes les combinaisons possibles.

Fonction d'échantillon à somme contrainte

La solution fournie s'appuie sur la fonction constrained_sum_sample_pos pour obtenir une distribution uniforme des résultats possibles. Cette fonction génère une liste d'entiers positifs (n) qui totalisent la valeur cible (total). Sa principale caractéristique est que chaque combinaison a une chance égale d'être choisie.

Distribution uniforme et personnalisation

La force de la fonction réside dans son fondement mathématique, qui garantit que toutes les combinaisons possibles sont également probables. De plus, il est facilement adaptable à d'autres scénarios, tels que la génération de sept nombres totalisant 100 ou tout autre total souhaité.

Implémentation

L'implémentation Python de la fonction est fournie ci-dessous :

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

Illustration graphique

La représentation graphique de @FM permet de comprendre clairement le fonctionnement de la fonction :

0 1 2 3 4 5 6 7 8 9 10   # The universe.
|                    |    # Place fixed dividers at 0, 10.
|   |     |       |  |    # Add 4 - 1 randomly chosen dividers in [1, 9]
a    b      c    d        # Compute the 4 differences: 2 3 4 1

Conclusion

Cette solution sophistiquée, basée sur L'échantillonnage à somme contrainte fournit une méthode robuste et impartiale pour générer des nombres aléatoires qui totalisent une valeur prédéfinie. Il garantit une probabilité égale pour tous les résultats possibles, ce qui en fait un outil fiable pour divers scénarios de programmation.

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