Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| La fonction X = RND(1) est elle vraiment aléatoire ? | |
| | Auteur | Message |
---|
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: La fonction X = RND(1) est elle vraiment aléatoire ? Jeu 29 Mar 2012 - 1:08 | |
| Salut à tous ! La valeur de la fonction X = RND(1) est-elle vraiment aléatoire ? Pour cette lancinante question, voici 4 petits programmes pour y répondre Prog 1 : Générateur aléatoire : Test d'équidistribution - Code:
-
' Générateur aléatoire : Test d'équidistribution ' ' La fonction X = RND(1) fournit un nombre entre 0 et 1 ' Le générateur aléatoire est censé être équidistribué sur 0-1 ' Principe : On découpe l'intervalle en un certain nombre de tranches égales ' (30 dans ce cas précis), on effectue un grand nombre de tirages aléatoires ' (300 par exemple) et on compte le nombre de fois où on est tombé dans chaque ' tranche. Si on a 300 tirages pour 30 tranches, on attend en moyenne 10 tirages ' par tranche. Plus on s'éloigne de 10, mois la distributionest conforme à ce que ' l'on désire. On calcule pour chaque tranche la quantité :(N-10)*(N-10)/10 où ' N est le nombre de tirage dans cette tranche. Si l'on additionne cela sur toutes ' les tranches, on obtient un nombre (le chi carré de la distribution) qui est ' une mesure de la qualité de cette distribution. Plus le chi carré est petit, ' meilleur est la distribution. ' Pour une partition en 30 tranches comme celle employée dans ce programme,une ' valeur du chi carré inférieur à 20 est excellente et une valeur comprise entre ' 20 et 35 est tout à fait acceptable. Si, en revanche, vous obtenez une valeur ' supérieure à 50, votre gégérateur aléatoire est très suspect.
dim nbtranches, nbtirages : nbtranches = 30 : nbtirages = 300 dim t(nbtranches),n,k,x,y,i label aleat
while n < nbtirages gosub aleat n = n + 1 k = 1 + int(x * nbtranches) : t(k) = t(k) + 1 ' print n end_while for i = 1 to nbtranches y = y + (t(i) - nbtirages/nbtranches) * (t(i) - nbtirages / nbtranches) next i y = y * nbtranches / nbtirages print " Valeur du CHI^2 = " ; y end
aleat: x = rnd(1) return
Prog 2 : Analyse graphique de la repartition bidimentionnelle - Code:
-
' Générateur aléatoire ' Analyse graphique de la repartition bidimentionnelle ' ' On trace des points au hasard sur l'écran en utilisant le générateur aléatoire ' et on constate de visu qu'ils sont bien ou non répartis au hasard.
dim nbpoints : nbpoints = 1000 : ' Augmenter ou diminuer cette valeur pour voir dim x,y,xp,yp,n
label aleat
color 0,0,0,0 : 2d_pen_color 0,255,0 : font_color 0,255,0,0
while n < nbpoints gosub aleat : y = x : gosub aleat ' Transformation en coordonnées écran xp = 100 + 320 * x : yp = 100 + 240 * y 2d_point xp,yp n = n + 1 print_locate 10,10 : print n; " / " ;nbpoints end_while
end
aleat: x = rnd(1) return
Prog 3 : Calcul des paramètres statistiques du générateur aléatoire - Code:
-
' Générateur aléatoire ' ' Calcul des paramètres statistiques du générateur aléatoire
' Ce programme examine moyennes et écarts-types pour les tirages pairs et impairs ' Pour un nombre de tirages suffisant, les moyennes doivent évoluer autour de 0.5 ' et les écarts-types autour de 0.288 ( 1/sqr(12) ). ' Ce programmes vérifie également si les tirages pairs et impairs sont indépendants ' en calculant leur coefficient de corrélation.
' Pour que votre générateur aléatoire soit correct, celui-ci doit être compris ' entre -0.05 et +0.05 (moins de 5% de corrélation).
dim nbtirages : nbtirages = 1000 : ' Valeur à modifier pour voir dim n,x,y,sx,sy,xy,x2,y2,vx,vy,cv
label aleat
while n < nbtirages n = n + 1 : gosub aleat : y = x : gosub aleat sx = sx + x sy = sy + y xy = xy + x * y x2 = x2 + x * x y2 = y2 + y * y end_while vx = sqr((x2 - (sx * sx / n)) / (n - 1)) vy = sqr((y2 - (sy * sy / n)) / (n - 1)) cv = (xy - (sx * sy / n)) / (n - 1) print " S T A T I S T I Q U E S " print print " Moyenne des tirages impairs : " ; sx / n print " Moyenne des tirages pairs : " ; sy / n print " Ecart type des tirages impairs : " ; vx print " Ecart type des tirages pairs : " ; vy print " Covariance : " ; cv print " Coefficient de corrélation : " ; cv /(vx * vy) end
aleat: x = rnd(1) return
Prog 4 : Calcul de PI par la methode de Monte-Carlo - Code:
-
' Générateur aléatoire ' Calcul de PI par la methode de Monte-Carlo
' On considère un quart de cercle inscrit dans un carré de coté 1 ' Le carré a une surface égale à 1 ' Le quart de cercle a une surface égale à pi/4
' Principe de Monte-carlo : ' si on trace un grand nombre de points au hasard dans le carré, le rapport ' de ceux qui sont dans le quart de cercle sur le nombre total est égal au ' rapport des surfaces , c-à-d pi/4
' Méthode : ' On tire un grand nombre N de points (X,Y) au hasard. Si X * X + y * y < 1, ' le point est dans le cercle; alors on augmente P de 1 (P = nombre de points ' dans le cercle). ' Lorsque N est très grand P/N tend vers pi/4
' Cette méthode n'est pas très efficasse, mais c'est probablement la plus simple
dim x,y,n,p,a
caption 0, " <CLICK> pour arrêter " while scancode = 0 x = rnd(1) : y = rnd(1) : n = n + 1 print_locate 10,10 print 4 * p / n if x*x + y*y < 1 then p = p + 1 end_while
| |
| | | Invité Invité
| Sujet: Re: La fonction X = RND(1) est elle vraiment aléatoire ? Jeu 29 Mar 2012 - 2:04 | |
| Bonsoir. C'est un vieux sujet qu'on a déjà évoqué ici. C'est pour cette raison que Klaus a fait une dll, et peut-être Jean Debord. Il faut rechercher les sujets. Ça date de bien un an, mais maintenant |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: La fonction X = RND(1) est elle vraiment aléatoire ? Jeu 29 Mar 2012 - 4:07 | |
| | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: La fonction X = RND(1) est elle vraiment aléatoire ? Jeu 29 Mar 2012 - 13:53 | |
| - Citation :
- La valeur de la fonction X = RND(1) est-elle vraiment aléatoire ?
Il faut bien voir comment fonctionne un générateur de nombres aléatoires. C'est toujours une simulation de hasard, à l'aide d'algorithmes plus ou moins sophistiqués, et de données de départ prises à des endroits spécifiques. Cela peut être lié à l'heure (le nombre de tics depuis le dernier boot, par exemple), le contenu d'une adresse mémoire spécifique, etc. Mais dans tous les cas, ce sont des informations de départ qui ne sont déjà pas aléatoires par définition, et on en dérive une valeur par un algorithme qui ne peut, en aucun cas, produire vraiment des valeurs aléatoires. C'est la raison pour laquelle certains langages de programmation (Fortran, par exemple) contiennent une fonction qui permet de changer la valeur de départ pour le générateur de nombres aléatoires ! Eh oui, il n'y a pas de hasard en programmation ! Les algorithmes se distinguent par leur aptitude à "peupler" un intervalle donné de façon plus ou moins homogène, avec le nombre croissant de valeurs générées. Mais cela n'a rien d'aléatoire. C'est un résultat voulu, construit dans l'architecture de l'algorithme. C'est pourquoi un parle aussi de "suites pseudo-aléatoires". Ce terme correspond déjà plus à la réalité. Et de toutes les manières, pour que l'effet statistique de "chances égales" pour une valeur soit sensible, il faut largement augmenter le nombre de tirages - au-delà de 100000, voir 1 million de tirages. Là, on peut mesurer la qualité de convergence de l'algorithme. Mais il fait toujours garder dans l'esprit que dans in tirage vraiment aléatoire, même avec un très grand nombre de tirages, il est possible que certains nombres ne soient jamais tirés, et même que certains intervalles ne soient jamais touchés. Bien sûr, cela ne se produira pas avec un algorithme informatique, puisqu'ils sont conçus justement pour que cela ne se produise pas. | |
| | | jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: La fonction X = RND(1) est elle vraiment aléatoire ? Jeu 29 Mar 2012 - 14:51 | |
| | |
| | | sergeauze
Nombre de messages : 391 Age : 72 Localisation : Hautes Alpes France Date d'inscription : 09/01/2010
| Sujet: re :La fonction X = RND(1) est elle vraiment aléatoire ? Jeu 29 Mar 2012 - 15:15 | |
| Salut à vous Cette question a toujours attiré mon attention et j'apprécie les réponses que Klaus lui apporte,avec des exemples à l'appuit,et toute sa pedagogie. Je vais tester les codes de papydal Le lien vers un post qui traitait du sujet/ https://panoramic.1fr1.net/t924-hazard-et-classements?highlight=hazardJ'utilise parfois la dll de klaus mais j'ai du mal a l'adapter à des programmes de tirage au sort,en dehors de la demo qu'il nous à fourni j'aurais besoin à l'occasion de plus d'information de sa part je sais qu'avec Panoramic 'j'enrichis..... mes connaissances . Bonne fin de journée | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: La fonction X = RND(1) est elle vraiment aléatoire ? Jeu 29 Mar 2012 - 16:40 | |
| Salut à tous ! Klaus, jean_debord, sergeauze merci pour la peine que vous avez prise pour me répondre. Merci pour les liens donnés. J’y étudierais les infos qui s’y trouve, le moment venu. Je ne savais pas que la question des nombres aléatoires eut été soulevée. Merci de tout coeur! A+
| |
| | | Severin
Nombre de messages : 547 Localisation : Braunschweig / Germany Date d'inscription : 13/12/2010
| Sujet: Re: La fonction X = RND(1) est elle vraiment aléatoire ? Jeu 29 Mar 2012 - 19:42 | |
| Den Startwert mit Zeit und Datum festlegen. Dann gibt es immer einen zufälligen Startwert.
Severin
Les startwert de temps et date. Il n'y a toujours une startwert accidentelle.
Severin | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: La fonction X = RND(1) est elle vraiment aléatoire ? Jeu 29 Mar 2012 - 21:46 | |
| Traduction: Fixer la valeur de départ avec l'heure et la date. Il y a alors toujours une nouvelle valeur de départ aléatoire.
Severin
@Severin: Leider kann Panoramic den Startwert nicht festlegen. Das geht auch nur in manchen Programmiersprachen (Fortran, ...), aber nicht in allen.
Malheuseusement, Panoramic ne sait pas imposer la valeur de départ. Cela ne marche de toutes façons que dans certains langages de programmation (Fortran, ...), mais dans dans tous. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: La fonction X = RND(1) est elle vraiment aléatoire ? Jeu 29 Mar 2012 - 21:57 | |
| Ça marchait aussi, avec le QBasic, pour initialiser le générateur: fonction 'Randomize'. Par exemple Randomize Timer, Timer étant une horloge au 1/18 de seconde démarrant à zéro à 0 heure. | |
| | | Severin
Nombre de messages : 547 Localisation : Braunschweig / Germany Date d'inscription : 13/12/2010
| Sujet: Re: La fonction X = RND(1) est elle vraiment aléatoire ? Jeu 29 Mar 2012 - 22:07 | |
| Fazit:
Jack ist gefragt. Randomize ist möglich ????
Conclusion: Jack est demandé. randomize est possible ????
Severin
| |
| | | Severin
Nombre de messages : 547 Localisation : Braunschweig / Germany Date d'inscription : 13/12/2010
| Sujet: Re: La fonction X = RND(1) est elle vraiment aléatoire ? Sam 31 Mar 2012 - 17:58 | |
| Ich hatte mal vor langer Zeit dieses Testprogramm geladen. Habe vergessen woher. Es könnte helfen RND zu prüfen. Eventuell kann jean_debord es Verbessern und Erklären. Severin J'avais chargé une fois il ya longtemps de ce programme de test. Je ne sais plus où. Cela pourrait aider à envisager RND. Peut-être que cela peut améliorer jean_debord et d'expliquer. Severin - Code:
-
' *** Test von RND ************************************************************* ' DIm n% ' n% = 16384 n% = 56 DIM i% DIM j% DIM x(n%) DIM sumx DIM sumsqx DIM mean DIM meanTotal DIM std DIM stdTotal
' *** Form 0000 Full_space 0 PRINT PRINT
FOR i% = 1 TO 10 sumx = 0 sumsqx = 0
FOR j% = 1 TO n% ' RANDOMIZE TIMER x(j%) = RND(n%) sumx = sumx + x(j%) sumsqx = sumsqx + x(j%) * x(j%)
NEXT j%
mean = sumx / n% std = SQR((sumsqx - sumx * sumx / n%) / (n% - 1))
Wait 1
PRINT mean," ", std meanTotal = meanTotal + mean stdTotal = stdTotal + std
NEXT i% ' ' ' ****************************************************************************** PRINT "-------------------------" PRINT meanTotal / 10," ", stdTotal / 10 PRINT " .5000000 ";" ", 1 / SQR(12)
' *****************************************************************************
' 4
' Dieses Format: ' mittlere Standardabweichung ' Mine: .4998024 .2888851 und
' ********************************************************************************* ' Wenn Ihr RND den Test nicht besteht:
' If the RND function in your BASIC (or compiled BASIC) is not good Wenn der RND-Funktion in Ihrem BASIC (oder kompilierte BASIC) ist nicht gut ' enough for your requirements, must you give up? genug für Ihre Anforderungen, müssen Sie aufgeben? No, you can still Nein, kann man immer noch ' simulate the RND function with a few BASIC statements. simulieren die RND-Funktion mit ein paar grundlegende Aussagen. The best form Die beste Form ' of RNG is called a `mixed congruential' RNG. der RNG, heisst 'gemischtes Kongruenz "RNG. To implement this form of Um diese Form der Umsetzung ' RNG, you simply select a seed number `R' (which may be zero), multiply RNG, wählen Sie einfach einen Samen Zahl `R '(der Null sein kann), multiplizieren ' it by a selected number, add a different selected number, then save only bis eine ausgewählte Zahl, fügen eine andere ausgewählte Anzahl, dann nur zu speichern ' the decimal portion of the resulting number for both the random number die Dezimalstellen der resultierenden Zahl sowohl der Zufallszahl ' and for the seed number for the next random number. und für die Startnummer für die nächste Zufallszahl. That sounds rather Das klingt eher ' complicated, but it's really quite simple: Just use something like kompliziert, aber es ist wirklich ganz einfach:
' Verwenden Sie einfach so etwas wie ' P = 21 and Q = 0.3271, ' and the formula: ' P = 21 und Q = 0,3271, ' und die Formel:
' R(n+1) = FRAC(R(n)*P+Q) ' R (n +1) = FRAC (R (n) * P + Q)
' Eine Unterroutine wie:
' 9000 R=R*P+Q :R=R-INT(R) :RETURN ' 9000 R = R * P + Q: R = R-INT (R): RETURN | |
| | | jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: La fonction X = RND(1) est elle vraiment aléatoire ? Dim 1 Avr 2012 - 15:24 | |
| - Severin a écrit:
Peut-être que cela peut améliorer jean_debord et d'expliquer.
Je ne sais pas si je vais m'améliorer mais j'ai essayé de comprendre ce que fait ce programme Sauf erreur de ma part, le programme tire 10 échantillons comportant chacun n% nombres aléatoires répartis uniformément entre 0 et n%. La moyenne théorique de ces n% nombres est n% / 2 et l'écart-type théorique est n% / sqrt(12) (voir http://fr.wikipedia.org/wiki/Loi_uniforme_continue) Pour chaque échantillon, le programme calcule la moyenne et l'écart-type, puis il calcule la moyenne de ces 10 moyennes et la moyenne de ces 10 écart-types. Il affiche les résultats ainsi que les valeurs théoriques. Le programme comporte une erreur : il faut remplacer la dernière ligne par : - Code:
-
PRINT n% / 2, " ", n% / SQR(12)
Les valeurs données dans la version originale correspondent à n% = 1 Voici le programme modifié : - Code:
-
DIM n% n% = 56 DIM i% DIM j% DIM x(n%) DIM sumx DIM sumsqx DIM mean DIM meanTotal DIM std DIM stdTotal
Full_space 0 PRINT PRINT
FOR i% = 1 TO 10 sumx = 0 sumsqx = 0
FOR j% = 1 TO n% x(j%) = RND(n%) sumx = sumx + x(j%) sumsqx = sumsqx + x(j%) * x(j%) NEXT j%
mean = sumx / n% std = SQR((sumsqx - sumx * sumx / n%) / (n% - 1))
Wait 1
PRINT mean," ", std meanTotal = meanTotal + mean stdTotal = stdTotal + std NEXT i%
PRINT "-------------------------" PRINT meanTotal / 10," ", stdTotal / 10 PRINT n% / 2, " ", n% / SQR(12)
| |
| | | Severin
Nombre de messages : 547 Localisation : Braunschweig / Germany Date d'inscription : 13/12/2010
| Sujet: Re: La fonction X = RND(1) est elle vraiment aléatoire ? Dim 1 Avr 2012 - 15:50 | |
| @ jean_debord
Danke für deine Mühe. Was sagen die statistischen Werte über die Funktion RND aus ? Ist RND zufällig, wie in dem Beitrag gefragt ? Severin
Merci de vous être dérangé. Qu'est-ce que les valeurs statistiques de la fonction RND? Est aléatoire RND, comme l'a demandé dans l'article? Severin | |
| | | jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: La fonction X = RND(1) est elle vraiment aléatoire ? Lun 2 Avr 2012 - 10:26 | |
| Non, la fonction RND n'est pas vraiment aléatoire, mais aucun générateur ne l'est... certains sont plus aléatoires que d'autres ! P. ex. avec ma DLL (lien donné précédemment) on obtient de meilleurs résultats : - Code:
-
DIM n% n% = 56 DIM i% DIM j% DIM x DIM sumx DIM sumsqx DIM mean DIM meanTotal DIM std DIM stdTotal DIM res%
DLL_ON "ranmt.dll"
Full_space 0 PRINT PRINT
FOR i% = 1 TO 10 sumx = 0 sumsqx = 0
FOR j% = 1 TO n% res% = DLL_CALL1("RanMT", ADR(x)) : ' Reel aleatoire dans [0, 1[ x = n% * x : ' Reel aleatoire dans [0, n[ sumx = sumx + x sumsqx = sumsqx + x * x NEXT j%
mean = sumx / n% std = SQR((sumsqx - sumx * sumx / n%) / (n% - 1))
Wait 1
PRINT mean," ", std meanTotal = meanTotal + mean stdTotal = stdTotal + std NEXT i%
PRINT "-------------------------" PRINT meanTotal / 10," ", stdTotal / 10 PRINT n% / 2, " ", n% / SQR(12)
Note : j'ai supprimé le tableau x, qui n'était pas indispensable. Cela facilite l'appel de la DLL. Il semble qu'on ne puisse pas passer d'élément de tableau à une DLL. | |
| | | Severin
Nombre de messages : 547 Localisation : Braunschweig / Germany Date d'inscription : 13/12/2010
| Sujet: Re: La fonction X = RND(1) est elle vraiment aléatoire ? Lun 2 Avr 2012 - 19:09 | |
| @ jean_debord
Danke für deine Arbeit. Läuft mit DLL. Am Wochenend hole ich mein Statistikbuch vom Boden. Mal sehen was die Werte aussagen. Severin
Je vous remercie pour votre travail. Fonctionne avec DLL. À la fin de semaine je vais prendre mon livre des statistiques à partir du plancher. Voyons ce que les valeurs d'état. Severin
| |
| | | Contenu sponsorisé
| Sujet: Re: La fonction X = RND(1) est elle vraiment aléatoire ? | |
| |
| | | | La fonction X = RND(1) est elle vraiment aléatoire ? | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |