Boo
@_ö
(03:36)  Bienvenue ! - Inscrivez vous pour poster ! -
@Boo, Nhut, Arvi89, 41 inconnu(s), 18 bot(s)

Login :  Mot de passe :      Se souvenir de moi.  Mot de passe perdu ?
/!\:: Cliquez ici pour vous inscrire et poster, créer des sujets ou des forums ! ::/!\
 « - 1/1 - » :: Pages
 Index » Vince//Nymphodusse//piwi :: Forum informatique & développement » Autres langages de programmation (7r) » nombres aléatoires en fortran
./Post de départ - nombres aléatoires en fortran
23.05.2002 - 12650
19:05  deleted - Posté : 23-06-2009  M
Il doit y avoir un truc que je ne comprends pas. Je compile le programme suivant avec ifort:
program testrand
c -------------------------------
intrinsic random_number
real harvest
integer i
c -------------------------------
do i=1,10
call random_number(harvest)
print *, harvest
enddo
c
end program testrand

J'obtiens bien une série de 10 nombres qui ont l'air aléatoires (flemme de faire des longs tirages et regarder l'écart-type).
Par contre quand je relance j'obtiens exactement la même liste !!!
Même avec des seeds:

program testrand
intrinsic random_seed, random_number
integer size, seed(2), gseed(2), hiseed(2), zseed(2)
real harvest(10)
data seed /123456789, 987654321/
data hiseed /-1, -1/
data zseed /0, 0/

call random_seed(SIZE=size)
print *,"size ",size
call random_seed(PUT=seed(1:size))

do i=1,10
call random_number(harvest)
print *, harvest
enddo
c
end program testrand
(code de la doc Intel)
Et bien pareil !
Alors ça me fait un peu chier, donc je voulais savoir si c'est normal, ou si c'est moi qui fait n'importe quoi encore une fois.
Merci! smile
./Publicité AdSense
./1
11.06.2001 - 19133
21:31  PpHd - Posté : 23-06-2009  M
Je dirai que c'est parce qu'il faut que tu seed avec une valeur aléatoire, genre le temps (ou clock).
Mais je ne connais rien au fortran wink
./2
10.06.2001 - 33210
23:54  Kevin Kofler - Posté : 23-06-2009  M
Un programme sur ordinateur est chargé depuis le disque dur à chaque fois, donc forcément les variables ne sont pas gardées entre les exécutions, il n'y a pas ce phénomène bizarre des programmes non-archivés non-compressés sur calculatrice ou sur d'autres plateformes embarquées qui exécutent directement en RAM, où les variables globales sont gardées entre exécutions.

Au "mieux" ta variable sera non-initialisée, ce qui en théorie voudrait dire qu'elle peut valoir n'importe quoi, mais en pratique la valeur est plutôt prévisible, souvent 0 ou une autre valeur restée sur la pile qui ne varie pas entre 2 exécutions successives. Et dans ce cas, ou aussi si tu initialises explicitement le seed (ou si ton compilateur Fortran est réglé pour initialiser tout à 0 automatiquement, c'est une option courante parmi les compilateurs Fortran pour faire marcher du code foireux qui traîne), évidemment que la valeur sera toujours la même. Il faut en effet lire une source externe (genre l'horloge comme suggéré par PpHd) pour initialiser ton générateur de nombres pseudo-aléatoires.
avatarMes news pour calculatrices TI: Ti-Gen (fr/en), MobiFiles (de)
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité
./3
12.08.2004 - 880
00:03  Azrael_CV - Posté : 24-06-2009  M
PpHd a vu juste. Quelques explications sur la page là : http://infohost.nmt.edu/tcc/help/lang/fortran/random.html

Les valeurs aléatoires sont identiques (c'est paradoxal) entre deux exécutions consécutives. C'est pour permettre de débuguer plus facilement un code. Pour vérifier la bonne marche du code on a besoin d'avoir la même séquence aléatoire (pseudo-aléatoire dans notre cas), ce qui est possible en initialisant la séquence aléatoire avec la même valeur de graine (seed).

Je ne sais pas si l'algorithme de génération de nombres pseudo-aléatoires est le même d'une machine à une autre ou même entre deux versions différentes d'un compilo. Pour éviter de tels aléas on utilise un fichier de nombres pseudo-aléatoires pour vérifier le comportement du code.
Gare à celui qui touche a mes chips quand je code !
./4
23.05.2002 - 12650
11:48  deleted - Posté : 24-06-2009  M
En fait il y avait une petite feinte pour initialiser avec la date et l'heure (ce qui était annoncé comme le mode par defaut dans la doc intel)
Il faut faire
call random_seed
et non
call random_seed()
comme j'ai essayé de le faire.
En tout cas merci pour vos explications, j'ai passé pas mal de temps à jouer avec la fonction d'heure (DATE_AND_TIME()) pour voir comment ça marche tout ça.
Au final je retiens le programme suivant:
      program testrand
intrinsic random_seed, random_number
integer i
real harvest
c Initialize with the correect seed size
call random_seed
do i=1,10
call random_number(harvest)
print *, harvest
enddo
c
end program testrand
Ca marche pas mal, excepté quand on lance successivement le programme très rapidement, la graine étant la même car l'heure est toujours dans la même seconde. Ce n'est pas gênant pour moi car le programme réel met plusieurs minutes à tourner, mais 'just in case', vous connaissez une fonction pour avoir des millisecondes? J'en ai pas trouvé à première vue...
./5
12.08.2004 - 880
08:24  Azrael_CV - Posté : 29-06-2009  M
Les fonctions DATE_AND_TIME ou SYSTEM_CLOCK devraient te donner satisfaction.
Gare à celui qui touche a mes chips quand je code !
./6
23.05.2002 - 12650
08:47  deleted - Posté : 29-06-2009  M
SYSTEM_CLOCK ne retourne que des secondes, mais DATE_AND_TIME donne bien des ms. Je connaissais cette fonction mais j'avais mal lu la doc. #couic#
Merci!
./7
12.08.2004 - 880
18:26  Azrael_CV - Posté : 29-06-2009  M
melbou (./6) :SYSTEM_CLOCK ne retourne que des secondes

Pas nécessairement, ça dépend de l'implémentation de cette fonction sur la machine. Avec un nombre de périodes d'horloge par seconde élevé on peut avoir les millisecondes.

De rien wink
Gare à celui qui touche a mes chips quand je code !
./Publicité AdSense
 « - 1/1 - » :: Pages
 Index » Vince//Nymphodusse//piwi :: Forum informatique & développement » Autres langages de programmation (7r) » nombres aléatoires en fortran

./Poster un nouveau message. - Ouvrir dans une nouvelle fenêtre
Login : Mot de passe :

url - image - media  
spoiler - pre - fixed
quote - box - hr
poll - code





Smileys
Smileys perso
Pièce jointe
     Flood control (?) :    
Les messages postés sont la propriété de leurs auteurs. Nous ne sommes pas responsables de leurs contenus.

» yN ©1624 - Aide / Charte / Crédits
74ms | Statistiques