CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C] Le hasard...

-_[Drogba13]_-
-_[Drogba13]_-
Niveau 10
07 mai 2009 à 19:54:44

Bonjour :)

J'aimerais de l'aide pour truc tout bête. Je créé 5 variables, et je voudrais donner à ces 5 variables une valeur (entière) aléatoire mais que la somme de ces 5 fasse obligatoirement 100.

J'avais bien une idée mais assez logiquement ça marche pas :

do
{
long variable1 = (rand() % (MAX - MIN + 1)) + MIN;
long variable2 = (rand() % (MAX - MIN + 1)) + MIN;
long variable3 = (rand() % (MAX - MIN + 1)) + MIN;
long variable4 = (rand() % (MAX - MIN + 1)) + MIN;
long variable5 = (rand() % (MAX - MIN + 1)) + MIN;
} while (variable1 + variable2 + variable3 + variable4 + variable5 != 100)

Help please :ange:

godrik
godrik
Niveau 30
07 mai 2009 à 20:15:59

oh une question complique...
Ce qui est complique c'est la repartition de ces valeurs. quel doit etre leur fonction de distribution.

Si tu te fous completement des valeurs et que tu veux juste qu'il y ait des valeurs differente d'une execution a l'autre alors la methode suivante me semble parfaite:

Tu tires 4 valeurs aleatoire dans l'intervale [0; 100]. tu trie ces valeurs en ordre croissant. tu as donc 4 valeurs v1, v2, v3, v4. tu ajoute v0=0 et v5=100.
les nombres genere x1, x2, x3, x4, x5 ont pour valeurs xi=vi- v(i-1).

Par construction leur somme fait 100.

-_[Drogba13]_-
-_[Drogba13]_-
Niveau 10
07 mai 2009 à 20:24:47

En fait au final cela doit donner une composition en pourcentages donc il faut que chaque valeur qui correspond a un pourcentage ait la même chance qu'un autre d'être grosse ou petite...

Kaoron
Kaoron
Niveau 9
07 mai 2009 à 21:00:38

Solution élégante godrik !

Méthode bourrin : tirage de 100 valeurs aléatoires dans [1;5] et comptage, ça suivra une distribution uniforme, et avec 100 valeurs ça devrait pas être trop plat.
Méthode folk : construire les bornes, avec 5 valeurs choisies aléatoirement parmi 100, ça te fera un truc carrément plus rigolo !

godrik
godrik
Niveau 30
07 mai 2009 à 21:11:56

drogb13, applique la methode que j'ai propsoe, elle devrait te suffir.

kaoron:
Je pense que ta methode folk et celle que j'ai propose sont equivalente. non ?

Ta methode bourrine est rigolote.
Elle passe mal a l'echelle. Si tu veux des valeures entre 0 et 10^6, il va falloir faire 10^6 tirage aleatoire.
Cependant elle permet de changer la distribution des valeurs. Si tu veux qu'un des valeur soit deux fois plus represente qu'une autre tu peux le faire, la ou ma methode ne le permet pas.

Kaoron
Kaoron
Niveau 9
07 mai 2009 à 21:46:29

Je pense que ta methode folk et celle que j'ai propose sont equivalente. non ?

Yep m'sieu ! J'y rajoutais juste mon petit commentaire sur la distribution des valeurs.

godrik
godrik
Niveau 30
07 mai 2009 à 21:52:04

ok, j'ai une methode intermediaire qui permet d'avoir le emme degre d'expression que la methode bourrin de karoan et qui fait moins de tirage aleatoire.

la methode genere k valeur dont la somme fait N.
Elle prends k parametre M1, M2, ..., Mk
Elle tire k valeur Xi avec Xi uniformement reparti entre 0 et Mi
Soit X la somme des Xi
la fonction retourne k valeur Vi = N*Xi/X

ainsi on en fait que k tirage aleatoire et on peut controler le ratio des valeurs.

PS: si on veut faire joujou, on peut prendre autre chose qu'une loi uniforme :)

chris_27
chris_27
Niveau 10
07 mai 2009 à 21:53:24

-_[Drogba13]_- : c'est trivial, tu génères 4 nombres et pour x5 tu mets 100 - x1 - x2 - x3 - x4. :-)

deepblue
deepblue
Niveau 16
07 mai 2009 à 21:57:53

Je suis parti dans cette esprit http://bordel.deblan.fr/html3/aleaSomme100.html

godrik
godrik
Niveau 30
08 mai 2009 à 01:15:45

quand on aime, on ne compte pas ces lignes de codes:

http://bmi.osu.edu/~esaule/generation/

Il y a 4 fichiers, une archive qui contient le code que j'ai utilise pour generer les trois figures:
http://bmi.osu.edu/~esaule/generation/godrik1.png
http://bmi.osu.edu/~esaule/generation/kaoronbourrin.png
http://bmi.osu.edu/~esaulsaule/generation/deepblue1.png

Il y a 10000 tirage de 5 valeures entre 0 et 100 dont la somme fait 100.

Ces figures presentent pour chaque methode propose la distribution de la k ieme valeure genere. On voit que les methodes kaoronbourrin et godrik1 sont homogenes: les courbes sont quasiment confondu. La methode deepblue1 est parcontre heterogene, les distribution des composantes sont differentes.

On peut egalement remarquer que kaoronbourrin genere des valeurs bien plus resserrer que les methodes deepblue1 et godrik1 (toutes les valeures genere par kaoronbourrin sont inferieur a 35). Je pense que ca s'explique facilement a l'aide du theoreme central limite.

godrik
godrik
Niveau 30
08 mai 2009 à 01:45:29

oh, j'avais oublie la courbe aggregation.png qui montre la repartition des valeures toute colonnes confondu des trois methodes de generations.

Comme on pouvait s'y attendre deepblue1 genere plus de haute valeure que godrik1 et kaoronbourrin genere des valeures equilibre autour de 100/5 = 20.

Si vous avez des idee pour d'autre methodes de generation, je les integrerais.

dnob700
dnob700
Niveau 10
08 mai 2009 à 12:37:20

Ma contribution ici se contentera d'indiquer un post de blog qui dit des choses intéressantes sur ce sujet en conjonction avec un peu de physique : http://www.madore.org/~david/weblog/2009-01.html#d.2009-01-31.1606

Mais ce n'est pas le même problème car il n'y a pas la contrainte sur la somme.

Cela dit, en effectuant un tirage bosonique (voir le post en question donc), avec la méthode de kaoron, on obtient une distribution encore moins plate. Car, godrik, tu dit plus haut que on peut choisir facilement la distribution avec cette méthode dite "bourrin" on peut choisir la distribution, mais ça ne me semble pas facile car le nombre que tu rend à la fin, c'est "combien de fois" chaque nombre est sortie, mais le lien en la distribution de ton tirage et celui que tu produit ne me semble pas clair. Avec la méthode décrite dans le lien que je donne, ça corrige un problème qui est qu'avec une trè grande borne (10^6 dans ton exemple godrik), on ne produit plus quelque chose de très centré sur 10^6/5, mais quelque chose qui doit être homogène je pense (bon, mais je ne suis pas sûr là).

godrik
godrik
Niveau 30
08 mai 2009 à 16:41:09

ouh, c'est un peu long, je lirais ca dans le details plus tard.

Oui, tu as raison, avec la methode bourrine de kaoron, on ne controle pas du tout la distribution des nombres, on controlle leur esperance (plus exactement les ratios des esperances).

Plus j'y pense et plus ca ressemble a un probleme classique. Quelqu'un aurait un knuth ou un knuth patashnik pour verifier si ce n'est pas dedans ?

lulu_salacia
lulu_salacia
Niveau 10
13 mai 2009 à 14:04:05

crée une variable qui somme tous les nombres, ensuite mets cette variable dans le test du while au lieu d'écrire l'opération.

godrik
godrik
Niveau 30
14 mai 2009 à 19:45:00

lulu, le probleme avec la methode de OP n'est clairement pas la. La probabilite qu'une solution valide soit trouver est extremement faible. Creer une variable temporaire ne va pas changer ca.

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Internet
  • Macintosh
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment