Posté le 30/11/2007 à 23:30 Membre depuis le 23/01/2004, 12372 messages
J'avais noté un truc dans les sources de mon tetrix :

SelectRandomObject:
	bsr	rand		;("andi.b #7,d0 // rts" seems to provide a strange random number... why??)
	moveq	#0,d1
	move.w	d0,d1
	divu.w	#7,d1
	swap.w	d1
	rts

Je pensais que andi.b #7,d0 me donnerait un nombre aléatoire entre 0 et 7, mais visiblement ce n'est pas le cas. Pourquoi?
J'ai obtenu une génération satisfaisante avec le code ci-dessus, mais est-ce la meilleure manière de faire?
avatarMon journal de bord <flux rss manuel> asTI68k : WIP </flux>

Le modernisme ne diffère guère de la libre pensée absolue que par sa prétention de demeurer catholique.
Posté le 30/11/2007 à 23:38 Membre depuis le 10/06/2001, 40253 messages
Les derniers bits d'un générateur à congruence linéaire comme celui de TIGCCLIB sont les moins aléatoires, donc la meilleure méthode est de prendre les premiers bits, c'est-à-dire de faire un shift vers la droite par 13.
Quand tu prends le modulo par 7, tu utilises tous les bits (7 étant impair et même premier), donc c'est mieux que par 8 (ton andi #7), mais le mieux reste d'utiliser cet algorithme (qui se trouve d'ailleurs à l'intérieur de stdlib.h):
#define random(x) ((short)((long)(unsigned short)rand()*(unsigned short)(x)/32768))
ce qui pour une puissance de 2 revient à diviser par (32768/x) (parce que 32768/x est entier), ce qui revient donc à une division par une puissance par 2 et à la fin des comptes à un shift vers la droite.
avatarMes news pour calculatrices TI: Ti-Gen (fr/en), MobiFiles (de)
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité
Posté le 01/12/2007 à 10:13 Membre depuis le 10/06/2001, 20910 messages
D'ailleurs, Martial, ta solution utilisant divu a un petit bug wink Le résultat est compris entre 0 et 6. C'est une division par 8 qu'il faut pour obtenir un résultat compris entre 0 et 7.
Tu te retrouves alors exactement dans la situation de départ avec andi, mais en plus lent.
avatarUn site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.
Posté le 01/12/2007 à 10:32 Membre depuis le 23/01/2004, 12372 messages
Pardon, je me suis mal exprimé, je cherche un nombre entre 0 et 6 (donc 7 possibilités, correspondant aux 7 blocs de Tetris). Ma solution donne un résultat aléatoire, mais le andi, non, pour la raison qu'a expliquée Kevin.

Merci Kevin d'ailleurs pour les explications.
avatarMon journal de bord <flux rss manuel> asTI68k : WIP </flux>

Le modernisme ne diffère guère de la libre pensée absolue que par sa prétention de demeurer catholique.
Posté le 01/12/2007 à 10:42 Membre depuis le 10/06/2001, 20910 messages
Oui mais ton andi donne un nombre entre 0 et 7 (soit 8 nombres, alors que tu n'en veux que 7). Ton divu donne un nombre entre 0 et 6 (soit 7 valeurs possibles, voilà pourquoi ça marche mieux).

C'est ça que je disais.
avatarUn site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.
Posté le 01/12/2007 à 19:23 Membre depuis le 10/06/2001, 40253 messages
Il reste le fait qu'un:
mulu #7,%d0
swap %d0

donnerait probablement un résultat meilleur. Ça devrait aussi être plus rapide que le divu.
avatarMes news pour calculatrices TI: Ti-Gen (fr/en), MobiFiles (de)
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité
Posté le 01/12/2007 à 19:33 Membre depuis le 23/01/2004, 12372 messages
Mais non!
move.w (7*%d0)<<16,%d0
tripo
avatarMon journal de bord <flux rss manuel> asTI68k : WIP </flux>

Le modernisme ne diffère guère de la libre pensée absolue que par sa prétention de demeurer catholique.
Posté le 09/08/2010 à 22:06 Membre depuis le 18/06/2001, -26082 message
Plop,

Je cherche à obtenir un nombre variant de -8 à +8. J'utilise rand de tigcclib.
J'ai écrit ce code :
	bsr	rand
	mulu.w	#8+1+8,d0
	swap.w	d0
	moveq.l	#-8,d5			; -8 < height < 8
	add.w	d0,d5			; New offset

Manifestement, j'obtiens un nombre très souvent négatif, rarement positif. D'après les posts au-dessus, je pensais pourtant être dans les clous... Qu'est-ce qui ne va pas ?
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
Posté le 09/08/2010 à 23:37 Membre depuis le 27/04/2006, 60448 messages
C'est étrange ce mulu... Autant pour le divu je comprends le fonctionnement, autant là je ne vois pas la logique confus
avatarZeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo
Posté le 09/08/2010 à 23:46 Membre depuis le 10/06/2001, 40253 messages
En principe, ce mulu devrait marcher, mais rand n'est certainement pas un générateur de nombres aléatoires parfait (loin de là).
avatarMes news pour calculatrices TI: Ti-Gen (fr/en), MobiFiles (de)
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité
Posté le 09/08/2010 à 23:53 Membre depuis le 27/04/2006, 60448 messages
Mais comment ça fonctionne ? Pour divu le swap permet de récupèrer le reste de la division, dont la distribution est uniforme ou presque (vu que 216 n'est pas divisible par 7 ou 17). Mais pour mulu ?
avatarZeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo
Posté le 09/08/2010 à 23:55 Membre depuis le 18/06/2001, -26082 message
Zerosquare -> c'est pour récupérer les bits supérieurs (les "plus aléatoires" si j'ai bien compris) dans l'upper word.
Le problème est que à un bit près, ou ça tire trop en positif (vraiment trop), ou trop en négatif (...).
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
Posté le 10/08/2010 à 00:00 Membre depuis le 27/04/2006, 60448 messages
Oh attends, en fait rand() retourne un résultat 8 bits ? Je pensais que c'était sur 16 bits...
avatarZeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo
Posté le 10/08/2010 à 00:43 Membre depuis le 18/06/2001, -26082 message
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
Posté le 10/08/2010 à 00:50 Membre depuis le 27/04/2006, 60448 messages
15 bits plutôt (plage 0 ~ 32767). Ah OK, j'ai pigé le principe je crois. Mais il faut multiplier par 34 (2 * 17) au lieu de 17, vu que le swap réalise une division entière par 216, alors que la valeur maximale de rand est 215 - 1.
avatarZeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo
Posté le 10/08/2010 à 09:24 Membre depuis le 18/06/2001, -26082 message
Ok, on va tenter d'essayer. J'ai jamais été très à l'aise avec ces modulos de congruences de je ne sais quoi d'autre encore grin
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !