J'essaie d'améliorer le code pour que la TI-62 applique d'elle-même la loi Khi2 à l'algorithme programmé pour générer les nombres aléatoires. J'imagine le programme comme suit :
########### Les données en entrée #####################
1. La semence initiale
2. Le nombre de tirages
########### Les calculs et les tests #####################
1. Le calcul du noyau du nombre pseudo-aléatoire "x"
2. Le calcul du nombre pseudo-aléatoire "n"
3. Le comptage de chaque chiffre tiré (cumulé en mémoires)
4. Le calcul de la formule Khi2
5. Le test Khi2
6. La sortie automatique du programme une fois la limite de tirage est atteinte
Je ne sais pas si vraiment l'on pourrait réussir à le faire vu les limites de la TI-62 mais ça vaut la peine d'essayer Curiosité scientifique
Casio FX-850P, FX-880P, FX-7000G, FX-7000GA, FX-3900P Canon X-07 Sharp E500, EL-9000, PC 1500 Texas Instruments TI-57 II, TI-62 Galaxy, TI-66 Programmable, TI-74 Basicalc, TI-74S, TI-95 Procalc " Les machines un jour pourront résoudre tous les problèmes, mais jamais aucune d'entre elles ne pourra en poser un !"Albert Einstein
Bonjour,
Je rencontre beaucoup de difficultés à implémenter le code car je dépasse les 42 pas. Au delà de cette limite de base, à chaque dépassement de 7 pas supplémentaires, une mémoire utilisateur est consommée donc perdue en tant que mémoire et transformée en 7 pas de programme.
Autrement dit, arrivé à 56 pas, j'ai déjà perdu R9,R8 et R7 sachant que la TI-62 n'en dispose que de 10 (R0 à R9)
Casio FX-850P, FX-880P, FX-7000G, FX-7000GA, FX-3900P Canon X-07 Sharp E500, EL-9000, PC 1500 Texas Instruments TI-57 II, TI-62 Galaxy, TI-66 Programmable, TI-74 Basicalc, TI-74S, TI-95 Procalc " Les machines un jour pourront résoudre tous les problèmes, mais jamais aucune d'entre elles ne pourra en poser un !"Albert Einstein
Je suis arrivé à récupérer le cumul de chacun des chiffres tirés et à les enregistrer respectivement dans R1, R2, R3, R4, R5 et R6 pour ensuite faciliter le calcul de Khi2 en mode Calcul cette fois en faisant appel au RCL0, ....., RCL7.
Pour gagner quelques pas de programme, on saisit en mode calcul :
1. Le nombre de tirages. Exemple 300 STO 0
2. La semence initiale. Exemple 0.261 STO 7
Si on peut encore l'optimiser, on gagnerais peut-être quelques pas pour calculer Khi2 dans le programme
Casio FX-850P, FX-880P, FX-7000G, FX-7000GA, FX-3900P Canon X-07 Sharp E500, EL-9000, PC 1500 Texas Instruments TI-57 II, TI-62 Galaxy, TI-66 Programmable, TI-74 Basicalc, TI-74S, TI-95 Procalc " Les machines un jour pourront résoudre tous les problèmes, mais jamais aucune d'entre elles ne pourra en poser un !"Albert Einstein
C.Ret a écrit : ↑31 janv. 2022 18:54
... Mais je vois un moyen plus économique en nombre de pas. Il utilise l'instruction de boucle DSZ qui évite toutes ces répétitions ...
Piste intéressante Je vais également l'exploiter sachant que l'instruction DSZ ne fait que de la décrémentation (donc pas d'incrémentation) et ne travaille qu'avec le registre R0
Casio FX-850P, FX-880P, FX-7000G, FX-7000GA, FX-3900P Canon X-07 Sharp E500, EL-9000, PC 1500 Texas Instruments TI-57 II, TI-62 Galaxy, TI-66 Programmable, TI-74 Basicalc, TI-74S, TI-95 Procalc " Les machines un jour pourront résoudre tous les problèmes, mais jamais aucune d'entre elles ne pourra en poser un !"Albert Einstein
On initialise en faisant 2nd CM puis 300 STO 0 (Nb de tirages) et 0.2684 STO 3 (graine). RST et R/S puis on patiente ou on arrête quand plus de pile
Dans RCL 1 on aura par exemple 1002005 qui veut dire que l'on a tiré 5 fois le 1, 2 fois le 2, 1 fois le 3
Dans RCL 2 on a la suite, par exemple 13022037 pour 37 fois le 4, 22 fois le 5 et 13 fois le 6
Dans RCL 0 le nombre de tirages qu'il reste encore à faire (si on s'est arrêté avant la fin)
from math import pi
from random import random
def algo(g = random(), tirages = 1000):
res = [0,0,0,0,0,0]
for _ in range(tirages):
g = (g + pi) ** 8 % 1
res[int(6 * g)] += 1
return res
def khi2(res):
print(res)
th = sum(res) / 6
return sum([(v - th) ** 2 for v in res]) / th
print(khi2(algo()))
# Résultats...
[185, 158, 168, 148, 183, 158]
6.62
[165, 182, 158, 168, 157, 170]
2.516
La plupart du temps l'algo passe le test du Khi2.
Pour revenir à mon programme précédent pour la Ti-62, vu que je n'ai utilisé que les mémoires de 0 à 3, il y aura p'tet une petite chance d'avoir suffisamment de pas pour calculer le Khi2...
On cherche à gagner quelques pas de programme pour éventuellement y insérer le calcul de Khi2 Avec ta proposition, on économise effectivement 15 pas Mais je pense que ça posera deux principaux problèmes :
a. Si l'on choisissait, à titre indicatif, un nombre de tirages important comme 18000 (ou plus, je n'ai pas vérifié et puis les piles vont peut être se décharger avant d’arriver au résultat final ), le contenu des registres R1 et R2 ne passerait pas en notation scientifique , ce qui rendrait inexploitable la lecture des cumuls de tirage
b. Avec une telle écriture condensée des cumuls, comment implémenter la formule Khi2
Casio FX-850P, FX-880P, FX-7000G, FX-7000GA, FX-3900P Canon X-07 Sharp E500, EL-9000, PC 1500 Texas Instruments TI-57 II, TI-62 Galaxy, TI-66 Programmable, TI-74 Basicalc, TI-74S, TI-95 Procalc " Les machines un jour pourront résoudre tous les problèmes, mais jamais aucune d'entre elles ne pourra en poser un !"Albert Einstein
Avec 3000 tirages, la répartition par face (de 1 à 6) doit théoriquement tourner vers les 3000 / 6 = 500 donc on a de la marge avec les 3 places 000-999.
Si on veut intégrer le calcul du Khi2 je pense effectivement qu'il faudrait se fixer un nombre de tirages, genre 600 (càd théoriquement 100 par face). Je n'ai pas testé le code ci-dessous mais qq chose comme (:
LBL 5
3 STO 0 // 3 nombres à récupérer par mémoire
10^X
STO 3
Lbl 6
RCL 1
INTG // On oublie la partie fractionnaire à chaque tour
/
RCL 3 // On divise par 1000
=
STO 1
FRAC // On récupère le nb x (partie fractionnaire entre 0.000 et 0.600)
-
.1 // (x - .1) ^2 (en théorie 100 soit 0.100)
=
x^2
STO+4 // Ajout dans mémoire 4 (qui initialement est à 0)
Dsz // On passe au nb suivant de la mémoire 1
GTO 6
R/S // Au premier arrêt on fait R/S, au second arrêt le résultat est dans la mémoire 4
RCL 2 // On recommence avec la mémoire 2
STO 1
GTO 5
Le résultat final est dans la mémoire 4, à multiplier par 100.
Mais encore une fois, je n'ai pas testé, c'est juste une idée...
LBL 1 00
2 01
X<>T 02
RCL 3 03
+ 04
PI 05
= 06
Y^X 07
8 08
= 09
FRAC 10
STO 3 11
* 12
6 13
= 14
INTG 15
X>T 16
GTO 2 17
SBR 3 18
ST+ 1 19
GTO 4 20
LBL 2 21
- 22
3 23
= 24
SBR 3 25
ST+ 2 26
LBL 4 27
DSZ 28
GTO 1 29
R/S 30 // Au premier arrêt on peut regarder tranquillement les mémoires 1 et 2
GTO 5 31 // pour connaitre les répartitions. Ensuite on appuie sur R/S
LBL 3 32
* 33
3 34
= 35
10^X 36 (INV LOG)
RTN 37
LBL 5 38 // Calcul du Khi2
3 39
STO 0 40
10^X 41
STO 3 42
Lbl 6 43
RCL 1 44
INTG 45
/ 46
RCL 3 47
= 48
STO 1 49
FRAC 50
- 51
. 52
1 53
= 54
x^2 55
ST+ 4 56
Dsz 57
GTO 6 58
RCL 2 59
x<>t 60
0 61
x = t 62 // On regarde si on a déjà traité la mémoire 2
GTO 7 63 // si oui affichage du khi2
STO 2 64 // On met la mémoire 2 à 0
x<>t 65
STO 1 66
GTO 5 67
LBL 7 68
RCL 4 69
* 70
1 71
EE 72
4 73
= 74
R/S 75
Il reste 4 mémoires de disponibles. Comme la première partie (tirages "aléatoires") fonctionne, j'ai juste testé le calcul du Khi2 en faisant 2nd CM (pour effacer la mémoire 4), 123095090 STO 1 et 93104095 STO 2 (ce qui fait 123+95+90+93+104+95=600) puis GTO 5 et R/S. J'obtiens 7.44 qui est la bonne valeur.
PS. Je viens de faire le test en vrai et après... 1h20, j'ai bien eu les 600 valeurs : 110 115 114 en mémoire 1, 110 079 072 en mémoire 2 et enchaînement sur le khi2=18,46
Bonsoir,
La formule utilisée pour le calcul du nombre pseudo-aléatoire est : n = INT[(b-a+1)*x] + a
Ce qui donnerait dans notre cas : n = INT (6 * x) + 1
Je ne vois pas le "+ 1" dans la formule c'est-à-dire à partir de la ligne 15
Casio FX-850P, FX-880P, FX-7000G, FX-7000GA, FX-3900P Canon X-07 Sharp E500, EL-9000, PC 1500 Texas Instruments TI-57 II, TI-62 Galaxy, TI-66 Programmable, TI-74 Basicalc, TI-74S, TI-95 Procalc " Les machines un jour pourront résoudre tous les problèmes, mais jamais aucune d'entre elles ne pourra en poser un !"Albert Einstein
Le +1 ne sert à rien, c'est juste pour nous humains. Avoir un dé avec des faces notées de 0 à 5 c'est pareil. Et c'est plus facile pour enregistrer dans les 2 mémoires plutôt que d'ajouter 1 et de l'enlever juste après.
Bonjour,
J'ai bien compris la moitié de ta solution Schraf , mais j'ai des difficultés à suivre ton raisonnement pour la seconde partie relative au calcul de Khi2 Peux-tu la commenter en vue de faciliter sa compréhension
Casio FX-850P, FX-880P, FX-7000G, FX-7000GA, FX-3900P Canon X-07 Sharp E500, EL-9000, PC 1500 Texas Instruments TI-57 II, TI-62 Galaxy, TI-66 Programmable, TI-74 Basicalc, TI-74S, TI-95 Procalc " Les machines un jour pourront résoudre tous les problèmes, mais jamais aucune d'entre elles ne pourra en poser un !"Albert Einstein
Donc tu as fixé le nombre de tirages à 600 et dans le programme tu as inséré Ti=100 comme une constante afin d'éviter de la calculer dans le programme par manque de pas. C'est ça Et si on désire changer le nombre de tirages, on recalcule manuellement le Ti correspondant et le réinjecte dans le programme comme constante Ou bien on considère que c'est un algorithme fait uniquement pour 600 tirages
Parce que si on prend par exemple le nombre de tirages 468, Ti=78, dans ce cas là il faudrait modifier pas mal de choses dans le programme
Casio FX-850P, FX-880P, FX-7000G, FX-7000GA, FX-3900P Canon X-07 Sharp E500, EL-9000, PC 1500 Texas Instruments TI-57 II, TI-62 Galaxy, TI-66 Programmable, TI-74 Basicalc, TI-74S, TI-95 Procalc " Les machines un jour pourront résoudre tous les problèmes, mais jamais aucune d'entre elles ne pourra en poser un !"Albert Einstein