Lars Gjörling
<6825>
· Text 907 · w8 · kommentar
1987-07-24 17:59
Ärende: Z80 slump
I Z80 Technical Manual talas inte om slumpmässighet, bara om att
S-flaggan är 'unknown' efter BIT b,r. Beträffande S-flaggan står det
på annat ställe att den visar 'sign' genom att kopiera bit 7 från r.
Jag misstänker att det är så att S-flaggan inte är opåverkad, men att
dess värde inte beror på utfallet av BIT-testet för bit b, utan av
värdet av bit 7. I så fall kan din metod inte fungera.
Vad slumptal beträffar, så räcker det inte med att det genererade
talet slumpmässigt och oförutsebart kan anta olika värden.
Sannolikhetsfördelningen måste också vara likformig, dvs vart och ett
av talen 0-255 måste ha samma sannolikhet att bli valt.
När du kastar tärning, har 1, 2, ... 6 lika stor sannolikhet varje
gång du kastar, där är sannolikhetsfördelningen likformig.
Men om du kastar 2 tärningar och lägger samman 'ögonen', så kan du
visserligen slumpmässigt erhålla vilket som helst av talen
2, 3, 4, ..... 12, men sannolikhetsfördelningen är inte likformig.
Summan 2 kan bara erhållas ett enda sätt (båda tärningarna visar 1)
men summan 7 kan erhållas på 6 st olika sätt. Det är därför 6 gånger
sannolikare att summan blir 7 än att den blir 1.
I ditt förslag till slumptalsgenerator finns BIT 0,r med 2 ggr,
vilket liknar ovanstående exempel. Det är nog ganska säkert att
fördelningen i varje fall inte skulle kunnat bli likformig.
Datorn genererar sina 'slumptal' med en algoritm, och de är alltså
inga riktiga slumptal. Om man vet värdet av ett 'slumptal' och har
kännedom om algoritmen, så man ju i förväg räkna ut vilket nästa
'slumptal' kommer att bli (roulettespelarens önskedröm). Men serien
av slumptal skall imitera slumpmässighet och måste därför ha bl a
likformig fördelning.
Risken för periodicitet är ett bekymmer. Om man med en algoritm i ett
assemblerprogram genererar 8-bitars tal, så blir (förutsatt att
fördelningen är likformig) sannolikheten 0,50 för att 18 olika tal
skall genereras i följd. Sannolikheten för 19, 20, .... är mindre än
0,50. Att använda 8-bitars register är helt olämpligt, om det inte
enbart gäller något eller några enstaka slumptal i hela programmet,
och då kan man lika gärna läsa av adress 65525 (TIC).
Vid 16-bitars tal är risken väldigt mycket mindre och vid 40-bitars
tal nästan obefintlig (om algoritmen är den rätta).
På datorns slumptalsgenerator kan man lätt göra olika tester
beträffande likformighet. Om man skriver ett basicprogram, som
genererar tärningkast, så kan man ha 6 räkneregister för de olika
utfallen. Om man 'kastar' ett stort antal gånger (t ex 60000), så
skall procenttalen ettor, tvåor etc tendera mot samma tal (16,7%).
Tyvärr räcker det inte ens med likformighet för att generatorn skall
imitera slumpmässighet på rätt sätt. Programmet
10 WHILE -1 : IF X<1 OR X>6 THEN X=1
20 PRINT X; : X=X+1 : WEND
genererar talföljden 1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4,5,6,......
vilken självfallet inte utgör några slumptal, men klarar
likformighetstestet med glans.
Man kan därför göra det s k pokertestet. I tärningpoker kan man ju
slumpmässigt få par, tretal, fyrtal etc. Även om man genererar tär-
ningkast med dator kan man få par (samma tal två ggr i följd), tretal
etc. Man förstår ju lätt, att när man slår en tärning, så är
sannolikheten 1/6 för att man får detsamma som föregående gång. Om
man har en räknare, som räknas upp varje gång det slumpas ut samma
tärningkast två gånger i följd, så bör i en stor serie detta hända i
16,7% av kasten. Tretal har p.s.s sannolikheten 1/36 = 2,8%. Osv.
De algoritmer, som används i datorerna, är noggrannt uträknade och
utprovade för att ge god imitation av en likformig sannolikhets-
fördelning. Andra statistiska fördelningar (poisson-, exponential-
etc) kan erhållas genom matematiska manipulationer av datorns
slumptal.
Mvh Lars