Obtenir de vrais nb aleatoire

Soyez le premier à donner votre avis sur cette source.

Vue 11 403 fois - Téléchargée 485 fois

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 / Exemple :


'*************************************************************************
' 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

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Egyde Messages postés 158 Date d'inscription lundi 17 mai 2004 Statut Membre Dernière intervention 16 juillet 2007
27 févr. 2006 à 21:43
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).
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 129
27 févr. 2006 à 22:41
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
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 févr. 2006 à 23:01
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.
Egyde Messages postés 158 Date d'inscription lundi 17 mai 2004 Statut Membre Dernière intervention 16 juillet 2007
28 févr. 2006 à 08:02
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.
Mindiell Messages postés 559 Date d'inscription jeudi 25 juillet 2002 Statut Membre Dernière intervention 5 septembre 2007 1
28 févr. 2006 à 09:56
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.

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.