Nombres aléatoires déterministes [Résolu]

cs_cheyenne 693 Messages postés samedi 18 mai 2002Date d'inscription 17 avril 2017 Dernière intervention - 18 avril 2014 à 01:29 - Dernière réponse : ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention
- 19 avril 2014 à 12:19
Bonjour,

Comment faire pour avoir plusieurs suites de nombres aléatoires toujours identiques et que chaque suite soit différente?
J'ai essayé Randomize n en changeant la valeur de n à chaque fois, mais pour la même valeur de n je n'ai jamais la même suite.

Merci pour votre aide
--
Afficher la suite 

Votre réponse

19 réponses

ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - Modifié par ucfoutu le 18/04/2014 à 07:33
0
Merci
Bonjour, Cheyenne,
On reprend, si tu le veux bien, ton message à son début, titre compris.
- des "nombres aléatoires déterministes" ? ===>> heu ... un nombre aléatoire ne détermine rien. Il est tout au plus issu d'un algorithme déterministe, ce qui est systématiquement le cas des nombres pseudo-aléatoires issus d'un générateur de nombres aléatoires. Un tel générateur qu'abrite un ordinateur est inévitablement "déterministe" par essence (puisque l'ordinateur est lui-même déterministe)

- un tel algo est dit "déterministe", parce qu'il influe malgré lui sur le tirage, quelle que puisse être la valeur de base sur laquelle il s'appuie (celle du timer, d'une température, etc ...), valeur inévitablement elle-même cyclique
- le fait qu'une valeur "déterminante" soit cyclique ne signifie absolument pas que l'on puisse déterminer la périodicité du cycle en cause. La détermination de cette périodicité serait de surcroît compromise par la nécessité de maîtriser celle (la périodicité) du mécanisme à mettre en oeuvre pour faire des relevés de valeurs. Or, la perfection nécessaire n 'existe pas, même si l'ordinateur possède la possibilité de travail en temps réel (le vrai temps réel).

Ta démarche me partait très compromise.



________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Commenter la réponse de ucfoutu
Whismeril 11637 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 juin 2018 Dernière intervention - 18 avril 2014 à 07:34
0
Merci
Bonjour

Comment faire pour avoir plusieurs suites de nombres aléatoires toujours identiques et que chaque suite soit différente?

heu.... si c'est identique c'est pas aléatoire, et si c'est pas aléatoire, les suites ne peuvent pas être différentes.....
cs_cheyenne 693 Messages postés samedi 18 mai 2002Date d'inscription 17 avril 2017 Dernière intervention - 18 avril 2014 à 12:07
Bonjour Whismeril,

Oui, au vu de ma demande tu as raison car le titre ne reflète pas mes besoins.
En fait je voudrais tirer une liste aléatoire et la reproduire ultérieurement à l'identique. voir les explications données à ucfoutu.

Cordialement,

Cheyenne
Commenter la réponse de Whismeril
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - Modifié par ucfoutu le 18/04/2014 à 07:59
0
Merci
Re-moi, et un salut à Whismeril
Bon ... Je n'ai apparemment pas réussi à me faire comprendre. On va le faire autrement, alors :
La différence (la seule vraie) entre les résultats d'un algo de tirage aléatoire déterministe (appelé PRNG) et un algo de tirage aléatoire non déterministe (appelé TRNG) réside en le fait que la valeur sur laquelle se base l'algo revient cycliquement dans le cas des algos PRNG et ne revient plus jamais dans le cas des algos TRNG. Ces derniers (les TRNG) sont du coup beaucoup plus lents.


A cheyenne, maintenant : tu me parais tout simplement confondre la cyclicité des PRNG et celle des tirages de tes suites en résultant

EDIT : Ah oui (je combats d'habitude pourtant l'usage des abréviations... et je viens de contrevenir à cette règle. Pardon ...)
Alors :
RNG = Random Number Generator (génér'ateur de nombre aléatoire)
et on y met devant : P (pour pseudo) ou T (pour True).



________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Whismeril 11637 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 juin 2018 Dernière intervention - 18 avril 2014 à 11:37
Hello, j'étais entrain de taper ma réponse au moment ou tu postais la tienne!
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 18 avril 2014 à 11:46
Amitiés à toi, whismeril.
Le vrai problème est que l'on ne sait pas avec précision ce que cheyenne veut faire.
On ne peut que faire des suppositions (toutes générant une solution différente selon l'hypothèse retenue).
Voir les autres messages.
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - Modifié par ucfoutu le 18/04/2014 à 08:59
0
Merci
Il se peut par contre que tu te sois mal exprimé et que ce que tu cherches à faire soit finalement assez différent.
Si ce que tu veux faire est tirer aléatoirement mais sur la base de valeurs (l'argument number de Randomize) revenant en cycle, ce n'est plus vraiment un tirage aléatoire (sauf la première suite) ===>> on utilise alors (comme exposé par l'aide VB6) à la fois la valeur négative de rnd et de quoi assurer un cycle répétitif ===>> exemple bâclé :

toto = Array(10, 15, 8) ' array de 3 valeurs que l'on va utiliser de manière cyclique
For k = 0 To 12 ' === et donc 4 cycles de racines pour randomize
y = k Mod 3 ' ===>> t donc 10, 15 ou 8
x = Rnd(-1) '
Randomize toto(y)
MsgBox (Rnd)
Next
mais cela serait assez curieux et remplaçable alors par un seul cycle de 3 tirages aléatoires, dont il suffirait ensuite de r(épéter en boucle les résultats issus du premier cycle !

Il vaudra sans doute mieux que tu exprimes à nouveau ta demande avec plus de précisions sur ce que tu veux obtenir.
Un exemple de tirages avec plusieurs tirages successifs, peut-être ?
Ce qui nous permettrait alors de te répondre en parfaite connaissance de cause.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 18 avril 2014 à 11:05
0
Merci
A tout hasard :
A moins que tu ne cherches finalement à faire quelque chose du genre :
 Randomize
'1) je remplis de nombres aléatoires un tableau dynamique de 4 lignes dont
' chaque ligne contient une liste de 5 nombres aléatoires de 0 à 7
Dim toto(1 To 4, 1 To 5) As Integer
For i = 1 To 4
For j = 1 To 5
toto(i, j) = Int((8 * Rnd))
' MsgBox toto(i, j)
Next
Next
'2) Je tire 20 fois au hasard dans le tablo toto
For i = 1 To 20
tirage_ligne = Int((UBound(toto)) * Rnd) + 1
'cette ligne étant ainsi tirée au hasard, j'en lis toutes les colonnes
MsgBox "voilà une liste (pouvant revenir) : " & vbCrLf & toto(tirage_ligne, 1) & vbCrLf & toto(tirage_ligne, 2) & _
vbCrLf & toto(tirage_ligne, 3) & vbCrLf & toto(tirage_ligne, 4) & vbCrLf & toto(tirage_ligne, 5)
Next
Et qui serait alors puiser aléatoirement dans une liste constituée une fois pour toutes de manière aléatoire.
cs_cheyenne 693 Messages postés samedi 18 mai 2002Date d'inscription 17 avril 2017 Dernière intervention - 18 avril 2014 à 12:01
Bonjour ucfoutu,

N'ayant pas donné assez d'explications ta solution de puiser dans une liste ne me convient pas car la liste n'est pas la même à chaque tirage.

Pour l'argument négatif de Rnd, je savais.

Précisions :
J'ai une Picture de 1000*1000, sur laquelle je dessine par exemple 10000 pixels au hasard, à chaque pixel posé, je fais un tirage afin de définir 8 directions. Un autre pixel vient se poser à côté du précédent. Cette dernière opération est faites x fois. (c'est selon)
Si un pixel touche le bord un nouveau point de départ est défini aléatoirement.
Si l'ensemble des pixels me convient je veux garder le paramètre qui m'a permis d'avoir cette configuration afin de la reproduire ultérieurement.
Ce n'est pas aussi brutal que cela, les couleurs sont appliquées en fonction de l'angle du pixel (par rapport au Nord) et ensuite la luminosité est dépendante du nombre de passage au point x,y. Cela fait produit parfois des motifs assez jolis et c'est pour cela que je voudrais le reproduire à la demande.

C'est un genre d'attracteur. Si cela peut donner une idée de création à certains...

Cheyenne
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 18 avril 2014 à 12:06
0
Merci
Il ne s'agit alors pas de tirages aléatoires répétés, mais de stockage en mémoire des valeurs retenues, stockage à conserver (en vue d'une réutilisation ultérieure) ou non ensuite, selon que satisfait ou non.
Commenter la réponse de ucfoutu
cs_cheyenne 693 Messages postés samedi 18 mai 2002Date d'inscription 17 avril 2017 Dernière intervention - 18 avril 2014 à 15:51
0
Merci
Re,

Je ne veux pas stocker toutes les valeurs générées car il y en a beaucoup trop. Si dans la première boucle je dessine disons 100 000 pixels et que dans la deuxième boucle je décide que chaque pixel doit parcourir 50 fois une des 8 directions cela me fait 500 000 valeurs à stocker !.
Je voudrais pouvoir seulement stocker le nombre (associé ou non à Randomize) qui a permis de générer cette suite.

Cheyenne

--
Commenter la réponse de cs_cheyenne
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 18 avril 2014 à 16:27
0
Merci
Je ne te comprends alors plus du tout.
Une' question, alors : comment (code) "génères"-tu cette "suite" à partir de ce "nombre stocké" ?
Commenter la réponse de ucfoutu
cs_cheyenne 693 Messages postés samedi 18 mai 2002Date d'inscription 17 avril 2017 Dernière intervention - 18 avril 2014 à 16:50
0
Merci
Re,

   nPIXELS  '  valeur d'un TextBox
   nDEP     '     "
   rand     '     "
   '  x et y = centre Picture

   For i = 1 To nPIXELS    '  nombre de pixels initiaux
      For j = 1 To nDEP    '  nombre de déplacements pour le pixel initial
         rand = rand + 1

         Select Case Int(8 * Rnd(rand) + 1)
            Case 1: y = y - 1
            Case 2: x = x + 1: y = y - 1
               '  etc jusqu'à Case 8
         End Select
         '  dessine le pixel en x,y avec une couleur dépendante de l'angle
      Next j
   Next i


Si le dessin me plait je stocke les valeurs des TextBox. Mais cela marche ne fonctionne qu'à moitié. A chaque lancement j'ai bien le même dessin. MAIS si je clique à nouveau sur le bouton de commande pour générer le dessin celui-ci est différent. Pourtant on part avec la même valeur de "rand".

Cheyenne

--
Commenter la réponse de cs_cheyenne
cs_cheyenne 693 Messages postés samedi 18 mai 2002Date d'inscription 17 avril 2017 Dernière intervention - 18 avril 2014 à 18:19
0
Merci
Re,

A priori ça marche :

rand = rand + j
Select Case Int(16 * Rnd(-rand) + 1)

La séquence est bien identique à chaque fois. Si je change le rand dans le TextBox j'ai bien sûr une nouvelle séquence. Le must est que si je rappelle le dessin celui-ci est le même !

En fait j'ai 16 possibilités de déplacement de 1 à 8 par pas de 1 pixel et de 9 à 16 par pas de 2 pixels. Cela donne un motif plus aéré.

Cheyenne
--
Commenter la réponse de cs_cheyenne
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 18 avril 2014 à 19:57
0
Merci
Je te suis de moins en moins,
Comment peux-tu espérer avoir les mêmes résultats à partir d'une même valeur rand alors que tes select case se font sur des valeurs totalement aléatoires ? ===>> ce n'est pas possible
Commenter la réponse de ucfoutu
cs_cheyenne 693 Messages postés samedi 18 mai 2002Date d'inscription 17 avril 2017 Dernière intervention - 18 avril 2014 à 22:34
0
Merci
Re,

3 TextBox + 1 ListBox + 1 bouton de commande

 Me.Font = "Courier New"
Private Sub Command1_Click()
   Dim i       As Integer
   Dim j       As Integer
   Dim h       As Integer
   Dim n       As Long
   Dim n1      As Long
   Dim n2      As Long
   Dim rand    As Double
   Dim t(16)   As Integer
   
   n1 = Val(Text1.Text)    '  nombre de pixels initiaux
   n2 = Val(Text2.Text)    '  nombre de déplacements pour chaque pixels
   rand = Val(Text3.Text)
   
   Me.Cls: List1.Clear
   For i = 1 To n1
      For j = 1 To n2
         rand = rand + j
         h = Int(16 * Rnd(-rand) + 1): t(h) = t(h) + 1
         If n * j < 200 Then List1.AddItem h
      Next j
   Next i

   Print
   For i = 1 To 16: Print Format$(i, " 00  ") & t(i): n = n + t(i): Next
   Print n, Print n1 * n2
End Sub


Cliques à volonté sur Command1 et tu auras toujours la même suite.
Changes la valeur de TexBox3 (le rand) et tu aras une autre site qui se répétera en recliquant sur Commad1. CQFD
J'ai fait un tableau afin de voir la répartition des valeurs sorties, c'est assez équilibré. Par contre dans la liste il y a parfois de nombreuses répétitions. Mais bon, le principe est là !

Cheyenne

--
Commenter la réponse de cs_cheyenne
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 19 avril 2014 à 07:32
0
Merci
Ben oui, pardi.
Tu es passé là d'un select case (ton message précédent) totalement aléatoire ( Select Case Int(8 * Rnd(rand) + 1) ) à un tirage "bridé", sans select case, tel qu'exposé plus haut (avec un rnd négatif).
1) ce n'est plus du tout la même chose
2) tu obtiendrais un résultat du même type en définissant directement une valeur toto égale à celle que retourne ton rnd négatif pour un rand déterminé !
Je te laisse à tes manoeuvres.
Commenter la réponse de ucfoutu
cs_cheyenne 693 Messages postés samedi 18 mai 2002Date d'inscription 17 avril 2017 Dernière intervention - 19 avril 2014 à 12:08
0
Merci
Bonjour ucfoutu,

Le fait qu'il n'y ait pas de Select Case ne change rien à l'affaire. Je t'en ai fait grâce, il vient après le tirage de h !.
Mais oui le tirage est maintenant bridé grâce à l'argument négatif.
C'est cela qui me bloquait auparavant. J'avais déjà essayé en négatif et sans Randomize rand, mais je ne faisais pas changer la valeur de rand dans la boucle j.
Je ne vois pas l'intérêt de définir un tableau contenant toutes les valeurs qui peuvent être très nombreuses. Je peux, par exemple, poser 10000 pixels avec 500 déplacements pour chacun. Autant avoir la valeur directement à partir de rand.
L'intérêt est que le "cheminement" des pixels varie justement en fonction de ce rand de base que l'on peut changer à volonté jusqu'à obtenir un dessin qui plait.
Une fois le dessin obtenu je sauvegarde dans un fichier ini, avec d'autres paramètres, les valeurs des 3 TextBox. Je peux ainsi rappeler le dessin qui sera ainsi identique.

Bon week-end,

Cheyenne
Commenter la réponse de cs_cheyenne
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 19 avril 2014 à 12:19
0
Merci
Oui, mais on est alors très, très très loin de ce que tu exprimais dans ton premier message et il n'y a maintenant plus rien d'aléatoire.
Une autre fois : tu y remplacerais la valeur de rand par celle du résultat (toujours identique) du rnd sur rand négatif et tu aurais la même chose, à ceci près que tu soulagerais (plus de rnd) ton processeur.
Je te laisse maintenant là ...
Juste une chose : si tu penses que ton problème est maintenant résolu, clos donc cette discussion (un clic sur le tag RESOLU au niveau de ton premier message).
Commenter la réponse de ucfoutu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.