Page 2 sur 3

Publié : sam. 07/oct./2006 21:16
par flaith
Dobro a écrit :je pense que t'a un problem avec ton ordi !!
chez moi mon programme en console fait varier les chiffres !! 8O
Pareil pour moi, les chiffres varient correctement !

Publié : sam. 07/oct./2006 21:23
par Backup
Merci flaith :D

il me ferai croire n'importe quoi SPH :lol:

Publié : sam. 07/oct./2006 21:41
par SPH
Pour eviter d'etre un "chercheur de merde" j'efface ce vilain post...

Publié : sam. 07/oct./2006 21:42
par Backup
Dommage pour Dri , car c'est quand meme lui qui ta donné cette methode en premier ! :?

Publié : sam. 07/oct./2006 21:45
par Backup
SPH a écrit :File:1->DodoRandom.exe
Image

File:2->dodorandom.pb
Image

tiens si tu prefere avec ton code voila

Code : Tout sélectionner

OpenConsole()
PrintN("DodoRandom(X)")
PrintN("")

PrintN("OpenConsole()")
PrintN("For i=1 To 10")
PrintN("RandomSeed (100)")
PrintN("PrintN(Str(Random(100)))")
PrintN("PrintN(Str(Random(100)))")
PrintN("PrintN(Str(Random(100)))")
PrintN("PrintN(Str(Random(100)))")
PrintN("PrintN('==')")
PrintN("Next")
PrintN("Repeat")
PrintN("ForEver")
PrintN("")

For i=1 To 10
RandomSeed (Random(3000))
PrintN(Str(Random(100)))
PrintN(Str(Random(100)))
PrintN(Str(Random(100)))
PrintN(Str(Random(100)))
PrintN("==")
Next
Repeat
ForEver

la les chifre ne se repete jamais !

Publié : sam. 07/oct./2006 21:48
par Backup
a balancer tes codes comme ça sans explication

tu vas passer pour un chercheur de merde toi ..

Publié : sam. 07/oct./2006 21:51
par SPH
Dobro a écrit :a balancer tes codes comme ça sans explication

tu vas passer pour un chercheur de merde toi ..
Toujours aussi charmant...
Est-ce parce que j'ai cassé le cryptage de brosse a dent et que tu n'y es pas arrivé ?
Ou est-ce parce que tu voulais me voler la vedette ?

Publié : sam. 07/oct./2006 21:55
par Backup
SPH a écrit :Ou est-ce parce que tu voulais me voler la vedette ?
heu ! je suis deja une vedette ici depuis pas loin de 4 ans !! :D

Publié : dim. 08/oct./2006 1:03
par Anonyme
Houla, SPH t'a vraiment le don d'énerver Mitch :D
Mise à part sa, le randomseed(random(xxx)) marche très bien.

Publié : dim. 08/oct./2006 1:46
par SPH
Cpl.Bator a écrit :Houla, SPH t'a vraiment le don d'énerver Mitch :D
Dodo tu veux dire ?
Cpl.Bator a écrit :Mise à part sa, le randomseed(random(xxx)) marche très bien.
NON NON et NON !! #lapinou
Vous commettez TOUS la meme erreur !!

Executez ca et seulement ca :

Code : Tout sélectionner

Debug ("Aleatoires :")
Debug Random (50)
Debug Random (50)
Debug Random (50)
Debug Random (50)

RandomSeed(50)

Debug ""
Debug ("Non aleatoires :")
Debug Random(50)
Debug Random(50)
Debug Random(50)
Debug Random(50)

RandomSeed(Random(20))

Debug ""
Debug ("Non aleatoires d'une autre table :")
Debug Random(50)
Debug Random(50)
Debug Random(50)
Debug Random(50)
Vous obtiendrez :
Aleatoires :
a
b
c
d

Non aleatoires :
22
23
47
37

Non aleatoires d'une autre table :
26
0
17
26
a, b, c et d sont aleatoires, et eux seuls.
Vous aurez beau faire autant de RUN que vous voudrez, vous aurez TOUJOURS les memes resultats.
PKOI ?

C'est fort simple : Le piege est ici :

Code : Tout sélectionner

RandomSeed(Random(20))
Puisqu'avant cette fameuse ligne de code on avait utilisé un RandomSeed, notre "Random(20)" est donc TOUJOURS le meme premier nombre de la table des nombres aleatoires crée pour l'occasion !
Donc, puisque "Random(20)" est une constante, ca reviens a changer de table aleatoire pour en prendre une autre; helas TJR la meme !

Vous avez capté maintenant ??????? :mad: 8)

Donc, pour annuler un RandomSeed, il faut (a defaut d'avoir un 'KillRandomSeed') un :
RandomSeed(Nombre_reellement_Aleatoire)
Interroger le ElapsedMilliseconds() est une solution temporaire mais pas parfaite car un programme demarrant avec la machine aura presque a coup sûr le meme ElapsedMilliseconds() et là, on retombe sur un nombre non reellement aleatoire...

Publié : dim. 08/oct./2006 2:37
par Anonyme
Avec un Randomseed(random(65535)) pas de pb. bizarre.

Publié : dim. 08/oct./2006 3:26
par poshu
Qu'il est bete ce SPH...

Publié : dim. 08/oct./2006 4:31
par SPH
Cpl.Bator a écrit :Avec un Randomseed(random(65535)) pas de pb. bizarre.
Captain bator, il y a une difference entre :

Code : Tout sélectionner

RandomSeed(Random(65535))
Debug Random(100)
et :

Code : Tout sélectionner

RandomSeed(15)
RandomSeed(Random(65535))
Debug Random(100)
Pour ceux qui ne l'auraient pas saisi :
- Le premier code donne en effet un nombre reellement aleatoire entre 0 et 100; lui meme basé sur une "table aleatoire" de 0 a 65535.
- Le deuxieme code est condamné a donner le nombre ZERO non aleatoire donc; et ce, malgré le faramineux RANDOM(65535) car le premier RandomSeed(15) condamne notre pauvre random(65535) a pointer sur "la table aleatoire" numero 59892 (si je puis m'exprimer ainsi !!)

Voici un moyen de retourner a coup sûr au mode aleatoire :

Code : Tout sélectionner

Debug ("Mode reellement aléatoire")
Debug Random(100)
Debug Random(100)
Debug Random(100)
Debug Random(100)
Debug ("-")


RandomSeed(10)
Debug ("Mode 'pseudo' aléatoire de la 'TableSeed' 10")
Debug Random(100) ; non aleatoire donc
Debug Random(100) ; non aleatoire donc
Debug Random(100) ; non aleatoire donc
Debug Random(100) ; non aleatoire donc
Debug ("-")


RandomSeed(Date()-ElapsedMilliseconds()) 
Debug ("Retour au Mode reellement aléatoire")
Debug Random(100)
Debug Random(100)
Debug Random(100)
Debug Random(100)
Les 2 conditions RandomSeed(Date()) et RandomSeed(ElapsedMilliseconds()) ne pourront plus jamais nous redonner la meme serie de nombres aleatoires. ElapsedMilliseconds avait le probleme du programme demarrant avec la machine, et Date avait le probleme de l'interval de moins d'une seconde.


Je n'ai rien contre toi, captain, mais quand je lis les posts de dodo et maintenant le post de poshu qui ne comprennent rien a ce mecanisme purement logique, j'en viens a me demander comment ils ont survecu aussi longtemps dans le monde complexe de la programmation !

Publié : dim. 08/oct./2006 9:18
par flaith
Les 2 conditions RandomSeed(Date()) et RandomSeed(ElapsedMilliseconds()) ne pourront plus jamais nous redonner la meme serie de nombres aleatoires. ElapsedMilliseconds avait le probleme du programme demarrant avec la machine, et Date avait le probleme de l'interval de moins d'une seconde.
Après plusiers essais, voici ce que cela me donne
Mode reellement aléatoire
7
57
16
83
-
Mode 'pseudo' aléatoire de la 'TableSeed' 10
15
54
13
67
-
Retour au Mode reellement aléatoire
7
57
16
83

************** Nouvel essai **************

Mode reellement aléatoire
91
66
90
79
-
Mode 'pseudo' aléatoire de la 'TableSeed' 10
15
54
13
67
-
Retour au Mode reellement aléatoire
91
66
90
79
Regardez bien le "Mode reellement aléatoire" et le "Retour au Mode reellement aléatoire"
:?:

Publié : dim. 08/oct./2006 10:16
par Backup
c'est ce que Dri (et moi) lui avons dit au debut !!

il n'y a pas de mode reellement aléatoire avec un ordi
puisque la sequence est toujour prise a partir d'une liste immuable

en fait ton exemple montre que le premier random(100) est deja une sequence "previsible" car un RandomSeed(x) est effectué au lancement du compillateur ....

donc cela revien a dire que mon RandomSeed(random(32000)) n'est pas plus idiot que RandomSeed(ElapsedMilliseconds()) !!! :)

puisque le RandomSeed(x) fait en fait sauter le pointeur de la liste a un endroit autre de cette meme liste :)

il me semble me souvenir que dans ST mag ils en avaient parlé
en expliquant que la liste de base sur lequel se promene un pointeur
(le fameux RandomSeed(x) du purebasic)
est une liste de chiffre a virgule qui va de 0 a 1 !! :D