begin process at 2008 08 30 12:28:15
1 234 003 membres
37 nouveaux aujourd'hui
14 294 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

OBTENIR DE VRAIS NB ALEATOIRE


Description

Est-il possible d'écrire un programme qui renvoi de vrais nombre aléatoire (imprévisible, équiprobable, et tout le tralala)? OUI! Comment? En se "servant" d'une source parfaitement aléatoire, extérieure au monde informatique. Ca nécessite bien sûr une "interface" entre le monde physique et le monde informatique. L'interface que j'utilise ici s'appelle random.org...

Source

  • '*************************************************************************
  • ' TRUERND - Obtenir de VRAIs nombres aléatoire grâce au service random.org
  • '
  • ' NECESSITE UNE CONNEXION INTERNET
  • '
  • 'Auteur : Egyde (sendoval_fr@yahoo.fr)
  • 'Date de création : 28/02/06
  • '*************************************************************************
  • Option Explicit
  • Private strmem As String
  • Private truernd() As String
  • Private Sub Command1_Click()
  • 'on se connecte à Random.org
  • Winsock1.Close
  • Text1.Text = ""
  • Winsock1.Connect "random.org", 80
  • End Sub
  • Private Sub Winsock1_Connect()
  • Dim cmd As String
  • 'raz du buffer de réception
  • strmem = ""
  • 'on formate la requête
  • cmd = "GET /cgi-bin/randnum?num=" & txtTotalNb.Text & "&min=" & txtSmallest.Text & "&max=" & txtLargest.Text & "&col=1" & vbCrLf & _
  • "Accept: text" & vbCrLf & _
  • "Referer: http://www.random.org" & vbCrLf & _
  • "Host: www.random.org"
  • 'note : le contenu des textbox devrait être vérifiés mais bon...
  • 'envoi de la requête
  • Winsock1.SendData cmd
  • End Sub
  • Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
  • Dim Buffer As String
  • Dim Reconnect As Boolean
  • Winsock1.GetData Buffer
  • strmem = strmem & Buffer
  • If IsAllReceived Then
  • truernd = Split(strmem, vbLf) ' à convertir en Double éventuellement
  • Text1.Text = Replace(strmem, vbLf, vbCrLf)
  • strmem = ""
  • Winsock1.Close
  • End If
  • End Sub
  • 'fonction qui retourne vrai ssi on a reçu tous les nombres aléatoires
  • Private Function IsAllReceived() As Boolean
  • Dim i As Long
  • Dim nboccur As Long
  • 'chaque nombre retourné par random.org est séparé par le caractère
  • 'VbLf. Pour déterminer si la page a été reçu dans son intégralité,
  • 'on compte simplement le nb d'occurence de ce caractères.
  • i = 1
  • nboccur = 0
  • While InStr(i, strmem, vbLf) > 0
  • nboccur = nboccur + 1
  • i = InStr(i, strmem, vbLf) + 1
  • Wend
  • If nboccur = CLng(txtTotalNb.Text) Then
  • IsAllReceived = True
  • End If
  • End Function
'*************************************************************************
' TRUERND - Obtenir de VRAIs nombres aléatoire grâce au service random.org
'
' NECESSITE UNE CONNEXION INTERNET
'
'Auteur : Egyde (sendoval_fr@yahoo.fr)
'Date de création : 28/02/06
'*************************************************************************

Option Explicit

Private strmem      As String
Private truernd()   As String

Private Sub Command1_Click()
    'on se connecte à Random.org
    Winsock1.Close
    Text1.Text = ""
    Winsock1.Connect "random.org", 80
End Sub

Private Sub Winsock1_Connect()

    Dim cmd As String

    'raz du buffer de réception
    strmem = ""
    
    'on formate la requête
    cmd = "GET /cgi-bin/randnum?num=" & txtTotalNb.Text & "&min=" & txtSmallest.Text & "&max=" & txtLargest.Text & "&col=1" & vbCrLf & _
          "Accept: text" & vbCrLf & _
          "Referer: http://www.random.org" & vbCrLf & _
          "Host: www.random.org"
    
    'note : le contenu des textbox devrait être vérifiés mais bon...
    
    'envoi de la requête
    Winsock1.SendData cmd
    
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)

    Dim Buffer As String
    Dim Reconnect As Boolean

    Winsock1.GetData Buffer

    strmem = strmem & Buffer

    If IsAllReceived Then
        truernd = Split(strmem, vbLf) ' à convertir en Double éventuellement
        Text1.Text = Replace(strmem, vbLf, vbCrLf)
        strmem = ""
        Winsock1.Close
    End If
       
End Sub

'fonction qui retourne vrai ssi on a reçu tous les nombres aléatoires
Private Function IsAllReceived() As Boolean

    Dim i As Long
    Dim nboccur As Long
    
    'chaque nombre retourné par random.org est séparé par le caractère
    'VbLf. Pour déterminer si la page a été reçu dans son intégralité,
    'on compte simplement le nb d'occurence de ce caractères.
    i = 1
    nboccur = 0
    While InStr(i, strmem, vbLf) > 0
        nboccur = nboccur + 1
        i = InStr(i, strmem, vbLf) + 1
    Wend
    If nboccur = CLng(txtTotalNb.Text) Then
        IsAllReceived = True
    End If

End Function

Conclusion

Le code proposé ci-dessus fait suite à la discussion très interessante d'une des sources de julien39 :
http://www.vbfrance.com/codes/FONCTION-VRAIMENT-ALEATOIRE_36257.aspx

Les nombres obtenus sont restreint aux entiers. Avec quelques opérations élémentaires, on obtient facilement un équivalent décimal.

Aléatoire ou pas aléatoire? Pour couper court aux débats métaphysiques, je renvoi les utilisateurs interessé à http://www.random.org/essay.html
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

  • signaler à un administrateur
    Commentaire de Egyde le 27/02/2006 21:43:20

    J'ai mis cette source dans la catégorie "Réseau & Internet". Vous comprendrez pourquoi...

    A ne pas utiliser dans le cadre d'applications 'sensibles' (cryptographiques) sans prendre quelques précautions préalables (vérifier le fichier hosts est, me semble-t-il, un minimum).

  • signaler à un administrateur
    Commentaire de DARKSIDIOUS le 27/02/2006 22:41:09 administrateur CS

    Je pense qu'essayer d'obtenir de véritables nombres aléatoire n'est qu'une pure utopie : dès qu'on se base sur quelque chose pour les générer, il ne s'agit plus de nombre aléatoire, car calculés... et oui, tu a beau faire appel à des prévisions météo (ou je ne sais trop quoi), ca n'en reste que des nombres quasi-aléatoires, mais tant qu'ils ont réussi à les générer, cela implique qu'une autre machine est capable de générer les mêmes nombres aléatoires...

    Enfin, la fonction standard de VB suffit déjà dans la majorité des cas je trouve !

    DarK Sidious

  • signaler à un administrateur
    Commentaire de BruNews le 27/02/2006 23:01:09 administrateur CS

    Tu ferais au moins aussi aléatoire en qlqs lignes asm placées dans une vraie dll, tu aurais par contre des résultats en quasi instantané.
    Suffit d'exporter une fonction InitRand() sans aucun param, tu obtiens le seedRand (conservé dans dll) par RDTSC et ce sera quasi irreproductible (1 chance sur 2 pow 64) car personne n'intervient sur ce seedRand et quasi aucune chance de retomber sur le même nombre de ticks processeur.

  • signaler à un administrateur
    Commentaire de Egyde le 28/02/2006 08:02:03

    Il est bien connu qu'un même capteur ne te donnera JAMAIS exactement 2 fois la même valeur, même dans des conditions initiales!! Donc, NON : une autre machine n'est pas capable de générer les mêmes nombres.

    Maintenant, utopie ou pas, il est certain qu'on peut se contenter de fonction déterministe tierce.

  • signaler à un administrateur
    Commentaire de Mindiell le 28/02/2006 09:56:33

    Pour précision intéressante, en France, le Rapido est le seul jeu de hasard ou la présence d'un huissier n'est pas obligatoire, puisque la francaise des jeux utilise aussi le bruit comme générateur de nombres.

    DarkSidious, li n'utilise pas la météo, mais le bruit. Le bruit est un signal faible qui correspond a la neige de ta télé, ou au crachat dans ta radio. Même sur un signal 220V qui fait marcher ton PC, tu as un bruit léger, qui doit tourner entre -5V et +5V et qui est donc tellement faible que inutile. Mais tu as rarement pile 220V au bout du circuit.

    Voila comment c'est generer. Très intéressant que des gens l'ait mis sur Internet.

  • signaler à un administrateur
    Commentaire de DARKSIDIOUS le 28/02/2006 10:38:09 administrateur CS

    Que ce soit de la météo ou du bruit, le raisonnement reste le même : je ne pense pas que ce système donne un générateur de nombre véritablement aléatoires. Le système utilisé reste matériel, donc il est possible (même si c'est sûrement très difficile) de le simuler par un ordinateur ou une autre machine.
    De là à dire qu'un même capteur te donnera JAMAIS 2 fois la même valeur, qu'est-ce qui te permet d'être aussi catégorique ?
    Peut-être que c'est vrai, mais tant que c'est une macine qui interprête ce que capte le capteur...
    C'est bien beau de mesurer quelque chose de totalement imprévisible, mais c'est la mesure qui devient le générateur du coup, plus le phénomène physique, puisque la précision de la mesure est forcément limitée.
    Je ne continuerai pas ce débat pour ne pas pourir les commentaires de cette source qui reste intéressante, mais c'était juste pour vous donner mon opinion : je ne crois pas qu'un générateur de nombre aléatoire parfait existe (sinon ca se saurais !!!).

    DarK Sidious

  • signaler à un administrateur
    Commentaire de Egyde le 28/02/2006 12:28:09

    "qu'est-ce qui te permet d'être aussi catégorique?"
    ----------------------------------------------------
    Tout simplement l'environnement : température ambiante, tension d'alimentation, pression atmosphérique, etc. De plus, n'oublions pas que reproduire la séquence nécessiterait d'être parfaitement synchroniser... Tenter de reproduire tous ces paramètres, ça s'est de l'utopie!

    "je ne crois pas qu'un générateur de nombre aléatoire parfait
    -------------------------------------------------------------
    existe (sinon ca se saurais !!!)"
    ----------------------------------

    Et bien justement... :

    "There is a DEFINITE NEED FOR DATA WITH ENTROPY NOT BASED ON ALGORITHMS. As to whether we need *true* random numbers, that's a subject for debate. Typically we get data that's as good as we need it to be from a hardware generator by running the initial data (which may have some kind of pattern or bias) through an algorithm which sort of mixes it. But it is very usefull to have this entropy come from a hardware device, because it affords an EXTRA LEVEL OF SECURITY; pseudorandom numbers can be compromised if the algorithm is known and the seed is discovered, but THERE IS NO SUCH EQUIVALENT FOR RANDOM NUMBERS GENERATED BY A HARDWARE DEVICE."

    Moses Liskov (faq-editor@rsa.com), http://www.rsa.com/ , year 2000

    Voir également :

    http://www.true-random.com/

  • signaler à un administrateur
    Commentaire de Lucyberad le 01/03/2006 01:28:53

    franchement, je comprend pas pourquoi on "s'emmerde" a chercher des random vrai et des random faux. que ce soit l'horloge du pc ou la meteo, du moment que les nombre finaux sont imprevisible, il n'y as que la nasa pour vouloir securiser par ce biais pour eviter de decouvrir les nombres par le hacking de l'algorythme.
    j'imagine bien mettre dans ma petite application, bonjour veuillez patienter durant le chargement d'un random parfait...
    sinon j'accorde parfaitement avec la pensée de darksidious !

  • signaler à un administrateur
    Commentaire de cuq le 01/03/2006 08:38:16

    Juste pour mettre mon petit grain de sel il me semble qu'il existe aussi sur certain Os (Linux) la génération de nombre aléatoire donné par les actions utilisateur . Nombre généré selon la séquence des touches utilisé sur le clavier, mouvement de la souris etc ... Donc la génération dépend d'une action humaine qu'il est plus difficile de reproduire , mais dans ce cas c'est directement l'os qui gère le nombre aléatoire ..

  • signaler à un administrateur
    Commentaire de Mindiell le 01/03/2006 08:59:20

    @Lucyberad
    C'est pas toujours une question d'algo de cryptage et de sécurité... Si la fonction de nombres aléatoires n'est pas correcte, tu te retrouveraas soit à cycler, soit à avoir une période de sortie différente pour chaque nombre lors de grands tirages.

    @DarkSidious
    Désolé, mais je crois que tu en fais un peu trop. Si ton capteur ne peut capter qu'entre -5.00 et +5.00, il captera totu de même des nombres imprévisibles. Le bruit est, par définition, un signal non prévisible.

  • signaler à un administrateur
    Commentaire de Egyde le 01/03/2006 09:52:02

    Pour ceux qui n'ont pas l'imagination suffisante pour comprendre l'intérêt de nombres générés de cette façon, il me semble que la citation tirée de rsa.com (le site spécialisé en cryptographie...) éclaire déjà suffisament la question.

    Bon, allez, je fais un petit effort :
    http://www.random.org/users.html

    Ca recense plus de 100 exemples d'utilisations... Des utilisateurs qui expliquent pourquoi ils utilisent random.org (un site web qui existe depuis 1998 tout de même).

  • signaler à un administrateur
    Commentaire de jannoman le 01/03/2006 21:52:38

    perso je pense qu'un générateur est aléatoire (entre 0 et 1 pour simplifier) si :
    1) la suite des nombres générés est équirépartie (i.e : lim Card {k <= n, a <= u(k) <= b} /n -> b - a
    (en gros ca dit que la probabilité de la suite de tomber dans un intervalle est proportionnelle à la largeur de l'intervalle)
    2) on ne peut pas connaissant u0, u1, ... u(n) deviner u(n + 1)

    pour DarkSidious : oui je pense comme toi que mesurer les variations d'un capteur c'est THEORIQUEMENT non aléatoire puisqu'il suffit de s'acheter le même capteur et de le faire fonctionner bien que PRATIQUEMENT à cause des effets chaotiques, ca marche

    comme le chaos existe au niveau atomique, on peut cependant supposer qu'il existe une machine permettant de créer des nombres aléatoires. (puisque 2 particules dans le même état strictement ne donneront pas 2 mêmes effets)

  • signaler à un administrateur
    Commentaire de Artispsyko le 13/05/2006 20:56:24

    Il n'est pas possible de fabriquer 2 capteurs identiques. Ou alors il faudrait s'amuser à les construire atome par atome (et donc de le payer million par million...). Et même là, les differents capteur renverraient des valeurs différentes, dues à l'environnement d'utilisation (celon la température, l'usure du capteur, les champs magnétiques environant, etc... - Le chaos est partout, nous sommes le chaos! ;)). On peut juste "viser" un interval de précision dans lka fabrivation d'un capteur, pour une plage d'utilisation donnée, dans un certain environnement.

  • signaler à un administrateur
    Commentaire de Kristof_Koder le 06/02/2008 22:25:01

    Je remet cent sous dans la machine !
    Juste pour dire que, une mesure physique de ce genre (audio, bruit sur une ligne, etc...) même s'il sont très difficile à reproduire ne sont pas pour autant aléatoire (au sens mathématique du terme) ! Ohn est juste dan sle domaine de l'imprévisible. Il y a juste trop de paramètres pour pouvoir être modéliser mathématiquement, mais c'est en théorie possible. On aborde alors le sujet des "théories du chaos".
    Il semble qu'il n'existe qu'un moyen de faire du véritable "aléatoire" ... en utilisant les lois de la physique quantique (et encore, tous les physiciens quantiques ne sont pas de cet avis !)En tout cas, c'est ce qui se rapproche le plus de l'aléatoire mathématique : Par exemple, lorsqsu'on lance un photon contre un mirroir semi-transparent selon un angle de 45°, soit le photon traverse le mirroir, soit il est réfléchit par ce même mirroir, repartant à 90° de se direction initiale. Des générateurs de nombres aléatoires fonctionnant sur ce principe existe : http://www.randomnumbers.info/

    Mais encor eune fois, tous les physiciens quantiques ne sont pas de cet avis !

Ajouter un commentaire

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
SITE MARCHAND LOCATION...
Budget : 3 000€
SITE MARCHAND POUR HOTEL
Budget : 4 000€

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Boutique

Boutique de goodies CodeS-SourceS