Till KTH:s startsida Till KTH:s startsida

Ändringar mellan två versioner

Här visas ändringar i "Random numbers (sw)" mellan 2015-01-30 10:11 av William Sandqvist och 2015-01-30 10:17 av William Sandqvist.

Visa < föregående | nästa > ändring.

Random numbers (sw)

Slumptal Kompilatorn Cc5x har ingen inbyggd funktion för att genererara slumptal ( pseudoslumptal ). Många algoritmer för slumptal utnyttjar multiplikation och division, något som inte är midrange PIC-processorernas starkaste sida.

Nedanstående algoritm bygger i stället på tekniken med "återkopplade shiftregister", som ger hyfsade slumptal utan allt för mycket kod ...

Lfsr.pngExempel på ett återkopplat skiftregister med 16 vippor. I figuren sker "avtappning" från vippa 0,2, 3, och 5.Skiftregistrets ingång matas med EXOR-funktionen av dessa bitar. Just denna "avtappning" ger en maximalt lång talsekvens som upprepas efter 65535 ggr.

wiki.png Källa Linear Feedback Shift Register, Vikipedia.

Slumptalsprogrammet nedan simulerar ovanstående återkopplade skiftregister.

C-Kompilatorn Cc5x har den inbyggda funktionen rr() som direkt motsvarar PIC-processorns rotationsinstruktion rrf.

rrf.gif

/* Random number function */ char rand( void ) { bit EXOR_out; static char rand_hi, rand_lo; /* values from last call will be used as seed for calculation of the next random number */ if( !rand_hi && !rand_lo ) rand_lo = 0x01; /* 0x0000 won't run ... */ EXOR_out = rand_lo.0; EXOR_out ^= rand_lo.2; EXOR_out ^= rand_lo.3; EXOR_out ^= rand_lo.5; Carry = EXOR_out; rand_hi = rr( rand_hi); /* rotate right, Cc5x internal function */ rand_lo = rr( rand_lo); return rand_lo; }

c.gif random690bb.c ( text.gif random690bb.txt )¶

random690bb.c

pseudorandom.png