Random numbers (sw)

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.png
Exempel 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

Feedback Nyheter