Advertisement
tm512

nemesis xorshift

Sep 2nd, 2012
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 0.76 KB | None | 0 0
  1. typedef struct
  2. {
  3.     uint32 seed;
  4.     uint32 rs [4];
  5. } xor_t;
  6.  
  7. static xor_t internal;
  8.  
  9. void xsrand (uint32 seed)
  10. {
  11.     xsrand_r (&internal, seed);
  12.     return;
  13. }
  14.  
  15. void xsrand_r (xor_t *x, uint32 seed)
  16. {
  17.     if (!seed)
  18.         x->rs [0] = seed - 1;
  19.     else
  20.         x->rs [0] = seed;
  21.  
  22.     x->seed = x->rs [0];
  23.  
  24.     x->rs [1] = x->rs [0] << 1;
  25.     x->rs [2] = x->rs [1] << 1;
  26.     x->rs [3] = x->rs [2] << 1;
  27.  
  28.     return;
  29. }
  30.  
  31. uint32 xrand (void)
  32. {
  33.     return xrand_r (&internal);
  34. }
  35.  
  36. uint32 xrand_r (xor_t *x)
  37. {
  38.     register uint32 tmp;
  39.  
  40.     tmp = x->rs [0] ^ (x->rs [0] << 4);
  41.  
  42.     x->rs [0] = x->rs [1];
  43.     x->rs [1] = x->rs [2];
  44.     x->rs [2] = x->rs [3];
  45.  
  46.     return x->rs [3] = (x->rs [3] ^ (x->rs [3] >> 13)) ^ (tmp ^ (tmp >> 13));
  47. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement