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

rand() innefficace ?

tauruxbis
tauruxbis
Niveau 10
19 juin 2011 à 15:24:37

Salut,

Avec mon frère on se fait des Group Battles sur Street Fighter 2, et on voulait se prendre les persos aléatoirement pour pimenter un peu la chose.
J'ai donc crée ce petit programme en C :
http://codeviewer.org/view/code:1bf2

Mais le problème c'est que rand() ne semble pas être si random que ça, voilà deux exécutions prises l'une après l'autre :
http://img190.imageshack.ck.us/img190/4969/deuxexec.jpg

Sauriez-vous la cause de ce problème, ou bien une solution alternative ?

Merci :)

Pocolo
Pocolo
Niveau 10
19 juin 2011 à 15:34:13

En effet, les nombres qui sont générés par cette fonction sont considérés comme pseudo-aléatoires car la série de nombre est elle-même définie par un nombre appelé "seed", si celui-ci ne change pas la série restera la même.

Tu peux changer ce nombre avec la fonction srand(), beaucoup de gens utilisent "srand(time(NULL))" pour obtenir un seed plus ou moins aléatoire en fonction du temps.

tauruxbis
tauruxbis
Niveau 10
19 juin 2011 à 15:35:06

Yep, je l'appelle bien avant chaque appel à rand() pourtant...

Pocolo
Pocolo
Niveau 10
19 juin 2011 à 15:38:56

Ah oui, je n'avais pas trop regardé le code en fait.

Cela-dit on voit que les deux listes sont un peu differentes, le problème c'est qu’étant donné tu choisis le seed en fonction du temps ce dernier doit être sensiblement le même a chaque fois que tu lances le programme vu que time() donne le nombre de millisecondes écoulées.

tauruxbis
tauruxbis
Niveau 10
19 juin 2011 à 15:41:52

Voici quatre nouveaux appels avec plusieurs secondes d'écarts entre chaque :

http://img856.imageshack.ack.us/img856/9487/4appels.jpg

Comme on peut le voir, les appels 1 et 3 sont quasiment les mêmes...

caelacanthe
caelacanthe
Niveau 10
19 juin 2011 à 15:42:55

https://www.jeuxvideo.com/forums/1-47-46404-17-0-1-0-printf-blabla.htm#message_53313

ca me rappelle cette discussion... apparament, c'est pas très efficace d'utiliser rand() avec un simple modulo :oui:

tauruxbis
tauruxbis
Niveau 10
19 juin 2011 à 15:44:43

Merci pour la technique, je vais tester ça :)

tauruxbis
tauruxbis
Niveau 10
19 juin 2011 à 15:50:30

Hmmm, il trouve toujours Ryu en premier, et semble boucler à l'infini sans jamais trouver le 2eme...

tauruxbis
tauruxbis
Niveau 10
19 juin 2011 à 16:05:18

Ca semble toujours retourner 1...
http://img59.imageshack.us/img59/5079/testrand.jpg

tauruxbis
tauruxbis
Niveau 10
19 juin 2011 à 16:09:24

En fait non, ça semble toujours retourner un nombre astronomique (négatif ou positif), quand on fait le calcul directement (et pas pas à pas comme dans ce programme de test).

Pocolo
Pocolo
Niveau 10
19 juin 2011 à 16:10:57

De toute façon les ordinateurs, du fait de la façon dont ils fonctionnent, sont incapables de générer des nombres vraiment aléatoires.

tauruxbis
tauruxbis
Niveau 10
19 juin 2011 à 16:11:11

En fait je n'ai rien dit, ça retourne toujours le même premier nombre qu'il sort (là c'est passé à 2, et tous les appels suivant retournent 2...)

tauruxbis
tauruxbis
Niveau 10
19 juin 2011 à 16:11:51

Oui mais j'aurais besoin "d'un minimum aléatoire" ^^

tauruxbis
tauruxbis
Niveau 10
19 juin 2011 à 16:15:43

J'vais tout casser ^^

Dans mon programme principal ça fait que renvoyer 2, et dans mon programme à côté qui génère juste le nombre aléatoire pareil, ça renvoie toujours un nombre astronomique (le même jusqu'à la prochaine execution).

tauruxbis
tauruxbis
Niveau 10
19 juin 2011 à 16:16:31

(enfin non il change pas à la prochaine exécution, il change toutes les secondes)

tauruxbis
tauruxbis
Niveau 10
19 juin 2011 à 16:20:42

En fait, si on enlève le "* N" à la fin, on remarque que ça génère environ 0.24xxxx, et que chaque seconde ce nombre est augmenté d'environ 0.0001, ce qui fait qu'on a toujours un truc à 0.2 et des brouettes, et qu'au bout de quelques minutes on aura un truc à 0.3.

pilo1488
pilo1488
Niveau 10
19 juin 2011 à 19:06:48

rand() ne s'utilise surtout pas avec un modulo!!!!

http://www.linux-france.org/article/man-fr/man3/rand-3.html

dans ton cas donc :
randnum = (int) (12.0*rand()/(RAND_MAX+1.0));

pilo1488
pilo1488
Niveau 10
19 juin 2011 à 19:30:44

http://codeviewer.org/view/code:1bf5

voila mon implémentation, c'est peut etre pas le top?
Quelqu'un a une autre astuce pour placer les éléments de la liste aléatoirement?

tauruxbis
tauruxbis
Niveau 10
19 juin 2011 à 19:38:46

Merci pour l'effort :)

(par contre j'ai toujours Vega en premier ^^)

caelacanthe
caelacanthe
Niveau 10
19 juin 2011 à 19:42:12

"(par contre j'ai toujours Vega en premier ^^)"

:d) je sais pas si c'est intéressant de srand à répétition, comme ça :(

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