Nombres pseudo-aléatoires
GW-Basic, utilisé par PC-Basic
Programme avec Texte Seulement
PC-BASIC
La fonction RND de GW-BASIC ne fabrique pas de vrais nombres aléatoires à partir de rien ; au lieu de cela, la fonction génère ce qu'on appelle des nombres pseudo-aléatoires et nécessite une «semence» de nombre aléatoire initiale (et variable) de sorte que les modèles de nombres produits pour l'exécution de chaque programme sont différents.
Cette graine prend généralement deux formes : si l'instruction RANDOMIZE est utilisée, l'utilisateur est invité à entrer un nombre ; si, à la place, l'instruction RANDOMIZE TIMER est codée, l'ordinateur extrait silencieusement un nombre de l'horloge interne de l'ordinateur. RND fonctionne, en coulisses, en utilisant une fonction récursive.
Cependant, essayer de trouver l'algorithme mathématique spécifique utilisé par GW-BASIC pour générer des nombres pseudo-aléatoires s'est avéré difficile. Dans l'article "A Theoretical and Empirical Comparaison of Mainframe, Microcomputer, and Pocket Calculator Pseudorandom Number Generators" (dans la revue académique Behavior Research Methods, Instruments, & Computers), l'auteur Patrick Onghena écrit que les langages de programmation Advanced BASIC (IBM, 1986), GW-BASIC (Microsoft, 1987) et QBASIC (Microsoft, 1991) fournissent la fonction RND, qui est initialisée par la commande RANDOMIZE avec un nombre compris entre -215 et 215 -1, et qui renvoie un nombre pseudo-aléatoire simple précision compris entre 0 et 1....
L'algorithme de génération n'est pas documenté dans le manuel. Nos lettres à Microsoft Inc. concernant l'algorithme restent sans réponse.
Onghena a écrit cela en 1993. Inutile de dire que je suis assez confiant que Microsoft ne révèlera pas de sitôt son algorithme de générateur de nombres pseudo-aléatoires GW-BASIC.
Néanmoins, le site Web de Microsoft indique que "Microsoft Basic utilise la méthode linéaire-congruentielle [une classe commune d'algorithmes de génération de nombres pseudo-aléatoires] pour la génération de nombres aléatoires dans la fonction RND", mais le "Basic" en question n'est pas GW-BASIC, mais probablement Quick-Basic et/ou Visual Basic. Le programme qui suit est une tentative de réduire l'algorithme du site Web à quelque chose de plus gérable par GW-BASIC.
Quand PSEUDO.BAS est exécuté, il vous sera demandé une graine initiale, puis des nombres "aléatoires" seront générés à l'écran, le tout sans utiliser la fonction RND.
Le point d'éclair dans le code est à la ligne 50 : c'est la fonction récursive qui génère les nombres pseudo-aléatoires. L'opérateur MOD permet l'arithmétique du module, donnant le reste d'un quotient. la ligne 80 continue la succession d'entiers pseudo-aléatoires.
Il y a plusieurs façons que PSEUDO.BAS pourrait être modifié de manière fructueuse. Par exemple, les valeurs initiales de A et C pourraient être modifiées, et la fonction récursive elle-même pourrait être modifiée.
10 KEY OFF:SCREEN 9:SCREEN
0:COLOR 15,1:CLS
15 PRINT "MÉTHODE LINÉAIRE-CONGRUENTIELLE POUR LA
GÉNÉRATION DE NOMBRE ALÉATOIRE"
20 A=213
30 C=2531
40 INPUT
"SEMENCES DE NOMBRE ALÉATOIRE DE 1 A 100)";INI
45 IF INI>100 THEN 40
46 IF
INI<1 THEN 40
50 X=(INI*A+C) MOD 2^6
60 PRINT X
70 'PRENEZ LE RÉSULTAT
ET REBRANCHEZ-VOUS À LA FORMULE
80 X2=(X*A+C) MOD 2^6
90 PRINT X2
95
PRINT:PRINT "Appuyez sur <ENTER> pour le prochain nombre aléatoire... (ou tapez
Q pour Quitter)..."
96 INPUT N$
97 IF N$="Q" OR N$="q" THEN CLS:END
100 X=X2
120 GOTO 70