"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > 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 ?

Publié le 2024-11-08
Parcourir:586

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 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 contribution à la somme.

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

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

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 autoriser les entiers non positifs, une modification est disponible :

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

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 chaque combinaison possible, que les nombres soient positifs ou non négatifs, a une probabilité égale d'être générée. 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.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3