Annuler un RandomSeed

Vous avez une idée pour améliorer ou modifier PureBasic ? N'hésitez pas à la proposer.
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message 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 !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Merci flaith :D

il me ferai croire n'importe quoi SPH :lol:
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Message par SPH »

Pour eviter d'etre un "chercheur de merde" j'efface ce vilain post...
Dernière modification par SPH le sam. 07/oct./2006 22:05, modifié 1 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Dommage pour Dri , car c'est quand meme lui qui ta donné cette methode en premier ! :?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

a balancer tes codes comme ça sans explication

tu vas passer pour un chercheur de merde toi ..
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Message 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 ?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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
Anonyme

Message par Anonyme »

Houla, SPH t'a vraiment le don d'énerver Mitch :D
Mise à part sa, le randomseed(random(xxx)) marche très bien.
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Message 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...
Anonyme

Message par Anonyme »

Avec un Randomseed(random(65535)) pas de pb. bizarre.
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Message par poshu »

Qu'il est bete ce SPH...
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Message 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 !
Dernière modification par SPH le dim. 08/oct./2006 12:57, modifié 1 fois.
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message 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"
:?:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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
Dernière modification par Backup le dim. 08/oct./2006 10:26, modifié 1 fois.
Répondre