La Place des Développeurs Random en assembleur ?
Reprise du message précédent
Tu charges le contenu de l'adresse Rand8+1, pas l'adresse !Quand il y a des parenthèses ou crochets, c'est le contenu de l'adresse, sans elles c'est la valeur proprement dite.
MSX un jour, MSX toujours !
Sector28
Membre non connecté
Villageois
tu ne sais pas lire l'instruction
on range l'accumulateur à cette adresse, c'est un code qui se modifie de lui-même
de plus il ne fonctionne pas en rom, c'est mauvais et complétement débile
voici une meilleure version
on range l'accumulateur à cette adresse, c'est un code qui se modifie de lui-même
de plus il ne fonctionne pas en rom, c'est mauvais et complétement débile
voici une meilleure version
Code ASM :
;This is a very simple linear congruential generator. ;The formula is x[i + 1] = (5 * x[i] + 1) mod 256. ;Its only advantage is small size and simplicity. ;Due to nature of such generators only a couple of higher bits should be considered random. ;Input: none ;Output: A = pseudo-random number, period 256 Rand8lda,(Seed); Seed is usually 0 ldb,a adda,a adda,a adda,b inca; another possibility is ADD A,7 ld(Seed),a ret
DONALD TRUMP IS FAST APPROACHING
NEMESIS ! RETURN IMMEDIATELY !
Sector28 :
tu ne sais pas lire l'instruction
on range l'accumulateur à cette adresse, c'est un code qui se modifie de lui-même
de plus il ne fonctionne pas en rom, c'est mauvais et complétement débile
voici une meilleure version
on range l'accumulateur à cette adresse, c'est un code qui se modifie de lui-même
de plus il ne fonctionne pas en rom, c'est mauvais et complétement débile
voici une meilleure version
Code ASM :
;This is a very simple linear congruential generator. ;The formula is x[i + 1] = (5 * x[i] + 1) mod 256. ;Its only advantage is small size and simplicity. ;Due to nature of such generators only a couple of higher bits should be considered random. ;Input: none ;Output: A = pseudo-random number, period 256 Rand8 ld a,(Seed) ; Seed is usually 0 ld b,a add a,a add a,a add a,b inc a ; another possibility is ADD A,7 ld (Seed),a ret
En fait je m'étais mal exprimé, mais tu confortes la chose qui me semblait bizarre Merci !
aoineko
Membre non connecté
Conseiller Municipal
Pour le modulo entre 0 et 3, un simple AND entre le résultat du random et 0x3 fera l'affaire.
Ça marche aussi pour 0-7, 0-15, 0-31, etc.
C'est le modulo du pauvre (mais très efficace).
Pas très sympathique de traiter de « mauvais et complétement débile » une solution qui n'a comme seul défaut de ne pas fonctionner en ROM. Pour faire fuir les gens de ce site, y a pas mieux... Edité par aoineko Le 02/11/2012 à 12h01
Code C :
BYTE mod_0_3 = mod_0_255 & 0x3;
Ça marche aussi pour 0-7, 0-15, 0-31, etc.
C'est le modulo du pauvre (mais très efficace).
Sector28 :
de plus il ne fonctionne pas en rom, c'est mauvais et complétement débile
Pas très sympathique de traiter de « mauvais et complétement débile » une solution qui n'a comme seul défaut de ne pas fonctionner en ROM. Pour faire fuir les gens de ce site, y a pas mieux... Edité par aoineko Le 02/11/2012 à 12h01
On est toujours ignorant avant de savoir.
aoineko
Membre non connecté
Conseiller Municipal
Hello,
Je voulais tester la qualité de différents algorithmes de génération de nombre (pseudo)aléatoire ; du coup, j'ai créé un petit programme qui affiche une heatmap (carte de chaleur) de la répartition de 32 milles tirages aléatoires.
Le principe est simple, je récupère un nombre aléatoire pour X et Y et je dessine à cette emplacement, en faisant évolué la couleur quand je touche plusieurs fois le même endroit.
Cela m'a permis d'écarter un certains nombre d'algorithme aux performances ou aux résultats trop mauvais.
Voila la liste de ceux que j'ai gardé pour ma libraire.
Le code source est disponible sur : https://github.com/aoineko-fr/CMSX/blob/master/cmsx/src/math.c
Très bon rapport qualité/cout, mais ne génère que 7-bits (0-127)
Version alternative proposé par ARTAG sur MRC.
Très bon algorithme 8-bits
Les performances de cet algo ne sont pas bonnes, mais l'idée est intéressante : on va piocher un nombre aléatoire en lisant une valeur mémoire au hasard (ce qui fait malheureusement perdre de l'entropie).
Un algo très simple. C'est une suite de la forme n+1 = (n * A) + C . En jouant sur les constantes A et C , on peut faire varier la distribution des tirages aléatoires. Avec 3 et 0x8721, j'ai trouvé des paramètres très peu couteux et qui marchent très bien.
Des paramètres recommandés par certaines publications. Répartitions très harmonieuses, mais avec des trous.
Pas forcement les paramètres les plus optimaux, mais c'est beau.
Très bon rapport qualité/cout. D'autres version de cet algorithme existe aussi.
Combinaison de 2 algo qui permet d'avoir un cycle de plus de 4 milliards de tirages !!
Je voulais tester la qualité de différents algorithmes de génération de nombre (pseudo)aléatoire ; du coup, j'ai créé un petit programme qui affiche une heatmap (carte de chaleur) de la répartition de 32 milles tirages aléatoires.
Le principe est simple, je récupère un nombre aléatoire pour X et Y et je dessine à cette emplacement, en faisant évolué la couleur quand je touche plusieurs fois le même endroit.
Cela m'a permis d'écarter un certains nombre d'algorithme aux performances ou aux résultats trop mauvais.
Voila la liste de ceux que j'ai gardé pour ma libraire.
Le code source est disponible sur : https://github.com/aoineko-fr/CMSX/blob/master/cmsx/src/math.c
7-bits R register accumulation
Très bon rapport qualité/cout, mais ne génère que 7-bits (0-127)
7-bits R register accumulation (by ARTAG)
Version alternative proposé par ARTAG sur MRC.
8-bits Ion random (by Joe Wingbermuehle)
Très bon algorithme 8-bits
8-bits Memory peek from R
Les performances de cet algo ne sont pas bonnes, mais l'idée est intéressante : on va piocher un nombre aléatoire en lisant une valeur mémoire au hasard (ce qui fait malheureusement perdre de l'entropie).
16-bits Linear congruential (A:3 C;0x8721)
Un algo très simple. C'est une suite de la forme n+1 = (n * A) + C . En jouant sur les constantes A et C , on peut faire varier la distribution des tirages aléatoires. Avec 3 et 0x8721, j'ai trouvé des paramètres très peu couteux et qui marchent très bien.
16-bits Linear congruential (A:75 C:74)
Des paramètres recommandés par certaines publications. Répartitions très harmonieuses, mais avec des trous.
16-bits Linear congruential (A:129 C:0x4321)
Pas forcement les paramètres les plus optimaux, mais c'est beau.
16-bit XOR Shift
Très bon rapport qualité/cout. D'autres version de cet algorithme existe aussi.
16-bit Linear Feedback Shift Register and LCG
Combinaison de 2 algo qui permet d'avoir un cycle de plus de 4 milliards de tirages !!
On est toujours ignorant avant de savoir.
T'es un Grand malade Guillaume euhhhh un PASSIONNé 3h13, tu dors jamais ??
C'est grace à des passionnés comme toi que les choses avancent
Merci
C'est grace à des passionnés comme toi que les choses avancent
Merci
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie