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] Un rand pas très random..

Glosoli
Glosoli
Niveau 10
13 janvier 2012 à 18:08:26

Bonsoir,

je m'exerce à l'allocation dynamique, avec un nombre alloué aléatoirement (avec la fonction rand donc)

Le souci est que rand est basé sur le temps..
Voici le code :d) http://pastebin.com/3MsGy0Nz (Simplifié à l'extrême)
J'ai basé le rand entre 1 et 100.. Lorsque je lance et éteint en boucle le programme, les nombres sont croissants (Je lance : ça affiche 5, de suite après il affiche 12, puis 18 etc..), bref, vous m'avez compris !

Y'a-t'il moyen de rendre le rand beaucoup plus random ? On dirait que de 1 à 100 il se passe 10 secondes.. Serait-il possible de le rendre beaucoup plus cours ? (Une seconde maximum)

Merci !

tbop2
tbop2
Niveau 10
13 janvier 2012 à 19:47:08

Je crois que je n'ai rien compris à ta question malheureusement. Qu'entends par rendre rand plus rand... et surtout plus court ? C'est quoi un nombre aléatoire court ?!

Pocolo
Pocolo
Niveau 10
13 janvier 2012 à 20:02:39

Le problème est très simple, c'est un programme très court dans lequel tu ne génères qu'un seul nombre aléatoire et à chaque fois que tu lances le programme tu fais appel à srand pour changer le seed.

Or en en faisant appel plusieurs fois à srand(time(0)) dans un laps de temps très court (moins d'une seconde par exemple), la série de nombres aléatoires sera toujours la même vu que la variable du temps n'aura pas changée, et si il n'y a que quelques secondes d'espace entre les deux elle sera juste sensiblement différente.

Bref ce que j'essaye de dire c'est que malgré que tu aies l'impression que ça marche très mal avec ton petit programme, cela marchera mieux avec un programme dans lequel tu ne fais appel à srand qu'une seule fois au début et dans lequel tu génères plusieurs chiffres aléatoires par la suite.

asxlife3
asxlife3
Niveau 9
13 janvier 2012 à 20:05:23

ou sinon il peut mettre un temps d'attende d'une seconde entre chaque génération :) par contre l'utilisateur devra attendre

Pocolo
Pocolo
Niveau 10
13 janvier 2012 à 20:05:41

Tu peux notamment essaye de faire une boucle dans laquelle tu génère une vingtaine de chiffres avec rand et tu verras que le résultat sera déjà meilleur.

Pocolo
Pocolo
Niveau 10
13 janvier 2012 à 20:06:28

" ou sinon il peut mettre un temps d'attende d'une seconde entre chaque génération :) par contre l'utilisateur devra attendre "

Non, cela ne servirait à rien.

Glosoli
Glosoli
Niveau 10
13 janvier 2012 à 20:14:39

J'ai déjà pensé à faire plusieurs rand un peu partout.. Je vais donc faire ça, merci !

chris_27
chris_27
Niveau 10
13 janvier 2012 à 20:21:24

Oulah... « random = … » ça ne sent pas bon. random est une fonction de la stdlib normalement. :)

À part ça, tu devrais avoir une suite aléatoire de nombres entre 1 et 100 presque uniformément (la proba d'avoir 100 est un pouillième moindre que celle d'avoir 1, parce que MAX_INT n'est pas un multiple de 100).

Pocolo
Pocolo
Niveau 10
13 janvier 2012 à 20:24:25

" J'ai déjà pensé à faire plusieurs rand un peu partout.. "

Euh, c'est à dire? :peur:

Tu en fais la où tu en as besoin et puis c'est tout, le seul problème comme je l'ai dit plus haut est qu'en relançcant ton programme toutes les deux secondes il y a trop d'appels à srand, tiens je t'ai confectionné deux exemples :

http://codepad.org/yC92KaTh
http://codepad.org/ZxrCgOoX

Comme tu pourras le remarquer le premier code donne un résultat légèrement meilleur que le deuxième...la seule différence dans le deuxième est que j'ai rajouté la ligne "srand((unsigned) time(0));" dans la boucle, il y a donc un nouveau seed basé sur le temps avant chaque génération de nombre aléatoire, ce qui reviens un peu au même que ce que tu faisais en lançant ton programme si souvent.

Glosoli
Glosoli
Niveau 10
13 janvier 2012 à 20:39:03

Ton deuxième code est exactement comme le mien !
Et ton premier c'est plus ou moins la même chose toujours..
Bref, tant pis, au final c'est pas plus grave, j'trouvais juste ça un peu dérangeant

+ j'ai jamais vu unsigned, ça fait quoi exactement ?

chris_27
chris_27
Niveau 10
13 janvier 2012 à 22:41:27

« j'ai rajouté la ligne "srand((unsigned) time(0));" dans la boucle » :d) ça ne sert à rien de mettre le srand dans une boucle... surtout que s'il est appelé plusieurs fois la même seconde, on ne va plus avoir une suite aléatoire du tout.

Glosoli : oublie unsigned… ce n'est pas trop conseillé. Pour ta culture, c'est un mot clé pour dire qu'on travaille en arithmétique non signée. Un char est un entier entre -128 et 127, alors qu'un unsigned char est un entier entre 0 et 255. En pratique, ça ne change rien à part pour l'affichage et certain tests.

Aldebran
Aldebran
Niveau 10
13 janvier 2012 à 22:44:32

"Oulah... « random = … » ça ne sent pas bon. random est une fonction de la stdlib normalement. "

Je ne crois pas que random soit une fonction de la stdlib, c'est plutôt rand la fonction.

"+ j'ai jamais vu unsigned, ça fait quoi exactement ?"

Unsigned signifie que la variable qu'il précède est non-signée, autrement dit, un nombre positif.

Sinon j'ai envie de dire que ta série de nombres aléatoires qui en fait est croissante, c'est juste une coïncidence. Normalement ton code devrait te retourner des nombres vraiment aléatoires.

Pocolo
Pocolo
Niveau 10
13 janvier 2012 à 22:49:04

" ça ne sert à rien de mettre le srand dans une boucle... surtout que s'il est appelé plusieurs fois la même seconde, on ne va plus avoir une suite aléatoire du tout. "

C'est bien pour cela que je l'ai mis, pour lui montrer le problème avec son programme.

chris_27
chris_27
Niveau 10
14 janvier 2012 à 00:12:14

Aldebran :

« RANDOM(3) Linux Programmer's Manual RANDOM(3)

NAME
random, srandom, initstate, setstate - random
number generator

SYNOPSIS
#include <stdlib.h>
»

Aldebran
Aldebran
Niveau 10
14 janvier 2012 à 12:01:03

C'est bizarre cette fonction random :(
Je viens de parcourir un stdlib.h que j'avais sous la main et ce prototype n'y est pas déclaré.

Pocolo
Pocolo
Niveau 10
14 janvier 2012 à 12:14:37

Elle ne fait pas partie de la norme ANSI.

chris_27
chris_27
Niveau 10
14 janvier 2012 à 12:36:02

ANSI c'est un peu trop vieux à mon goût pour servir de référence.

Cette fonction est BSD4.3 et POSIX 2001. Du coup, elle peut effectivement ne pas exister sous windows. Il n'en reste pas moins que ce n'est pas prudent d'utiliser un tel nom pour un variable. :-)))

Pocolo
Pocolo
Niveau 10
14 janvier 2012 à 12:50:34

" c'est un peu trop vieux "

Oui et non, la dernière norme ANSI n'est pas si vieille vu qu'elle correspond à la norme ISO de C99 il me semble.

chris_27
chris_27
Niveau 10
14 janvier 2012 à 16:41:16

Ça reste toujours plus vieux que le POSIX 2001. :-p

(bon, ok, quand on me dit ANSI, ce n'est pas au C99 que je pense.)

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