HispaMSX

Re: [hispamsx] Números aleatorios

2000-10-21 20:47:07
Antoni Burguera Burguera soltó algo así como: 

Lo más extendido es obtener una semilla del registro R con tan sólo
hacer LD A,R. Lo malo es que esto no funciona en Z380 y puede que no 
funcione
en un hipotético nuevo micro compatible para MSX.

¿Se puede usar el valor de R directamente como número aleatorio?

Si, directamente. Es lo que hacemos todos :)

O sea, para MSX-2... lo que ocurre es que yo apenas se programar en
ensamblador, y para empezar he decidido hacer un juego que se ajuste a
las bases del concurso de 4 KB, o sea, para MSX-1.

Es muy complicado acceder a la función RND del BASIC? Cómo calcula los
números la función RND?

Hmmm. Tengo el algoritmo en BASIC. Si eres capaz de pasarlo a ASM, aquí
lo tienes:

RND function :
--------------

As we have learned from BASIC manuals, we have RND function, that gives
us a RaNDom number. Anyway any computers can't give any real random numbers.
They are allways calculated from someting.

In MSX and SVI computers they are calculated by using followwing algorithm :

NEW = FRC(21132486540519 * OLD + 0.14389820420821)

Because it is quite a hard to understand it like this, I wrote a example
proggram in BASIC to simulate RND function :

10 ' Here we have to split these numbers, elseway BASIC is
20 ' going to lose some important desimals :
30 '
40 M1= 21132480000000#:  A1= .1438982#
50        M2= 6540519#:            A2=4.20821E-09
60 '
70 R=RND(-TIME) ' Here we give a new seed for RND function. Seed is allways
80 '              reseted, when we start runnig a BASIC proggram.
90 '
100 CLS
110 PRINT "If you are going to use positive numbers for RND(X) funtion,"
120 PRINT "then here is next 10 values, that you are going to get :"
130 PRINT STRING$(65,"-")
140 '
150 FOR I = 0 TO 9
160 '
170 L1 = 1E-07*INT(R*10000000!)
180 L2 = R-L1
190 HE = 10000000!*(M2*L2+A2)
200 H1 = (M1*L2)-INT(M1*L2)
210 H2 = (M2*L1)-INT(M2*L1)
220 H3 = H1 + H2 + A1 + 1E-07 * INT(HE)
230 H4 = H3 - INT(H3)
240 H5 = 1E-07*(HE - INT(HE))
250 R  = H4 + H5
260 PRINT I;"|";R
270 '
280 NEXT I





Un saludo,


Jose Angel Morente (jam(_en_)ag0ny(_punto_)com)
                   (warau(_en_)BonBon(_punto_)net)
*MSX DREAMS*       (msxdreams(_en_)hotmail(_punto_)com)

¡Suscríbete a HispaMSX!
http://www.egroups.com/group/hispamsx
hispamsx-subscribe(_en_)egroups(_punto_)com

msxmsxmsxmsxmsxmsxmsxmsxmsxmsxmsxmsxmsxmsxmsxmsxmsxmsxmsxmsxmsx


<Anterior en la conversación] Conversación actual [Siguiente en la conversación>