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!