113 votes

Génération d'une liste de nombres aléatoires, dont la somme est égale à 1

  • Cette question n'est pas un doublon de Obtenir N nombres aléatoires dont la somme est M parce que :
    1. Le plus les réponses qui y sont données concernent la théorie, et non une solution de codage spécifique en python pour répondre à cette question.
    2. La réponse acceptée ici a 5 ans de plus que la réponse dans le duplicata qui répond à cette question.
    3. La réponse acceptée en double ne répond pas à cette question

Comment faire une liste de N (disons 100) nombres aléatoires, de sorte que leur somme soit égale à 1 ?

Je peux faire une liste de nombres aléatoires avec

r = [ran.random() for i in range(1,100)]

Comment puis-je modifier cela pour que la somme de la liste soit égale à 1 (il s'agit d'une simulation de probabilité).

1voto

guessing Points 11

Générer 100 nombres aléatoires, peu importe l'intervalle. additionnez les nombres générés, divisez chaque individu par le total.

1voto

Parthesh Soni Points 63

Si vous souhaitez fixer un seuil minimum pour les numéros choisis au hasard (c'est-à-dire que les numéros générés doivent être au moins égaux à 1 000. min_thresh ),

rand_prop = 1 - num_of_values * min_thresh
random_numbers = (np.random.dirichlet(np.ones(10),size=1)[0] * rand_prop) + min_thresh

Assurez-vous simplement que le nombre de valeurs à générer (num_of_values) est tel qu'il est possible de générer les nombres requis ( num_values <= 1/min_thesh )

Donc, fondamentalement, nous fixons une certaine partie de 1 pour le seuil minimum, puis nous créons des nombres aléatoires dans l'autre partie. Nous ajoutons min_thesh à tous les nombres pour obtenir la somme 1. Par exemple : disons que vous voulez générer 3 numéros, avec min_thresh=0.2. Nous créons une partie à remplir par des nombres aléatoires [1 - (0.2x3) = 0.4]. Nous remplissons cette portion et ajoutons 0,2 à toutes les valeurs, de sorte que nous pouvons également remplir 0,6.

Il s'agit d'une mise à l'échelle et d'un décalage standard utilisés dans la théorie de la génération de nombres aléatoires. Le mérite revient à mon ami Jeel Vaishnav (je ne suis pas sûr qu'il ait un profil SO) et @sega_sai.

1voto

Sam S Points 89

Une solution alternative serait d'utiliser random.choice et de diviser par la somme :

import random 
n = 5
rand_num = [random.choice(range(0,100)) for r in range(n)] # create random integers
rand_num = [i/sum(rand_num) for i in rand_num] # normalize them

1voto

Antiez Points 179

Inspiré par la réponse de @sega_sai avec une implémentation numpy à jour et recommandée. [Mars 2022]

from numpy.random import default_rng

rng = default_rng()
rng.dirichlet(np.ones(10),size=1)
>>> array([[0.01279836, 0.16891858, 0.01136867, 0.17577222, 0.27944229,
        0.06244618, 0.19878224, 0.02481954, 0.01478089, 0.05087103]])

Références :

0voto

Paul Evans Points 8997

Vous pourriez facilement faire avec :

r.append(1 - sum(r))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X