Répartition aléatoire de nombres

Discussion générale entre passionnés et amateurs de mathématiques sur des sujets mathématiques variés
kounta38
Messages: 2
Enregistré le: 05 Fév 2014, 15:56

Répartition aléatoire de nombres

par kounta38 » 05 Fév 2014, 16:17

Bonjour à tous,

Je cherche à réaliser une petite application informatique pour un jeu de rôle, mais je ne parviens pas à établir "l'algorithme" :mur: !

Il s'agit de répartir un nombre de points (30) aléatoirement entre 10 variables, sachant qu'on attribue à chaque variable un nombre au hasard entre 1 et 5, qu'aucune variable ne peut être nulle et que tous les points doivent être utilisés.

Par exemple:
v1=5
v2=4
v3=1
v4=3
v5=3
v6=2
v7=5
v8=2
v9=1
v10=4

La série doit être "tirée" en une fois si possible, et de préférence j'essaye d'éviter un 1er tirage bancal qui sera "rattrapé" en piquant des points à droite ou à gauche (c'est comme ça que je procède quand je le fais à la main).

Merci d'avance !



ffpower
Membre Complexe
Messages: 2542
Enregistré le: 13 Déc 2007, 04:25

par ffpower » 05 Fév 2014, 17:56

Initialise les 10 variables a 1, de sorte qu'il reste 20 points a repartir

Maintenant, a chaque etape: choisis au hasard une des variables qui n'est pas a 5, et incremente la de 1.
Fais ca 20 fois et c'est fini..

Avatar de l’utilisateur
Ben314
Le Ben
Messages: 21709
Enregistré le: 11 Nov 2009, 21:53

par Ben314 » 05 Fév 2014, 18:19

ffpower a écrit:Initialise les 10 variables a 1, de sorte qu'il reste 20 points a repartir

Maintenant, a chaque etape: choisis au hasard une des variables qui n'est pas a 5, et incremente la de 1.
Fais ca 20 fois et c'est fini..
En procédant de la sorte, tu risque de dépasser 5 pour l'une des variables.
Et si tu "bloque" la variable une fois qu'elle est arrivée à 5 (i.e. tu interdit au programme de la réaugmenter), il n'est pas trés difficile de vérifier qu'il n'y a plus équiprobabilité des différentes solutions (mais est-ce trés génant ?)
A la rigueur, ce qui marche c'est de tout recommencer depuis le début si à un moment donné on fait passer une variable de 5 à 6 (mais je sais pas combien de tentatives il faudra en moyenne pour aboutir à un résultat avec toutes les variables <=5...)
Qui n'entend qu'un son n'entend qu'une sonnerie. Signé : Sonfucius

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 05 Fév 2014, 18:27

hello,

sans aucune preuve juste au feeling..
Code: Tout sélectionner
nbPoints = 0
maxPoints = 30
for i = 1 a 10
    missingPoints = 30 - nbPoints
    minRand = max(  missingPoints-5*(10-i)  , 1)
    maxRand = min(5, maxPoints - nbPoints - (10-i))
    val(i) = rand(minRand,maxRand)
    nbPoints+=val(i)
end
random_permute(val)


on random, jusqu a ce qu on soit oblige de truquer le hasard pour s assurer d atteindre 30
puis apres on permute le tableau

avec la subtilite de rand:
if minRand > maxRand then minRand = maxRand


edit:OOPS, jai oublie que toutes les valeurs doivent etre assignees
edit2: il suffit donc de placer 1,2,3,4,5, et de rappliquer ci-dessus, et on est assuré dès lors d'avoir toutes les valeurs. (pour 30-(1+2+3+4+5) points à la place, avec seulement 10-5 valeurs)
edit3: ca a l'air pas trop mal, en générant 1000 tableaux, et en comptant le nombre de 1,...,5 sortis, j'obtiens pour trois simulations
Code: Tout sélectionner
{ '1': 2030, '2': 1972, '3': 1972, '4': 2020, '5': 2006 }
{ '1': 2029, '2': 1965, '3': 2005, '4': 1979, '5': 2022 }
{ '1': 1978, '2': 2029, '3': 1994, '4': 2013, '5': 1986 }
la vie est une fête :)

ffpower
Membre Complexe
Messages: 2542
Enregistré le: 13 Déc 2007, 04:25

par ffpower » 05 Fév 2014, 18:36

Je bloquais les variables a 5 oui, mais ce n'est effectivement pas equiprobable, bien vu..

kounta38
Messages: 2
Enregistré le: 05 Fév 2014, 15:56

par kounta38 » 06 Fév 2014, 11:43

Bonjour et merci à tous,

J'ai combiné les idées de tout le monde et ça fonctionne !!

Il faut:
- Initialiser toutes les variables à 1
- J'ouvre une 1ère boucle
- Dans une 2ème boucle (à l'intérieur de la 1ère), je prend une variable au hasard et je vérifie qu'elle est strictement inférieure à 5 (donc valeur de 1 à 4); si ce critère n'est pas respecté, je recherche une autre variable et ainsi de suite. Quand la variable est trouvée, fermeture de la 2ème boucle.
- J'incrémente la variable trouvée précédemment de 1 point
- Je vérifie si la somme de toutes les variables est égale au nombre de points total à répartir (30): si la somme atteint 30 points, fin de la 1ère boucle et du programme; si ce n'est pas le cas, je recommence la 1ère boucle (tirage aléatoire d'une variable <5 et incrémentation de 1 puis contrôle de la somme des variables) jusqu'à ce que la somme fasse 30.

Et voilà !
Pour ceux que ça intéresse, la procédure est développée en VBA Excel et je peux la poster.
En tout cas, merci à tous :++:

 

Retourner vers ⚜ Salon Mathématique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 8 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite