Advertisement
Guest User

Untitled

a guest
Sep 24th, 2017
295
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. INTERFACE MT19937ar;
  2.  
  3. IMPORT Word;
  4.  
  5. PROCEDURE initGenrand(s: Word.T);
  6. PROCEDURE initByArray(key: ARRAY OF Word.T; length: INTEGER);
  7.  
  8. PROCEDURE genrandInt32(): Word.T;
  9. PROCEDURE genrandInt31(): INTEGER;
  10. PROCEDURE genrandReal1(): LONGREAL;
  11. PROCEDURE genrandReal2(): LONGREAL;
  12. PROCEDURE genrandReal3(): LONGREAL;
  13.  
  14. END MT19937ar.
  15.  
  16. (**********************************)
  17.  
  18. MODULE MT19937ar;
  19.  
  20. IMPORT Word;
  21. FROM Word IMPORT And, Xor, Or, RightShift, LeftShift;
  22.  
  23. CONST
  24.   n = 624;
  25.   m = 397;
  26.   matrix_a = 16_9908b0df;
  27.   upper_mask = 16_80000000;
  28.   lower_mask = 16_7fffffff;
  29.  
  30. VAR
  31.   mt: ARRAY [0..n-1] OF Word.T;
  32.   mti := n + 1;
  33.  
  34. PROCEDURE initGenrand(s: Word.T) =
  35.   BEGIN
  36.     mt[0] := And(s, 16_ffffffff);
  37.     FOR mti := 1 TO n - 1 DO
  38.       mt[mti] := 1812433253 * (Xor(mt[mti-1], RightShift(mt[mti-1], 30))) + mti;
  39.       mt[mti] := And(mt[mti], 16_ffffffff);
  40.     END;
  41.   END initGenrand;
  42.  
  43. PROCEDURE initByArray(key: ARRAY OF Word.T; length: INTEGER) =
  44.   VAR i, j, k: INTEGER;
  45.   BEGIN
  46.     i := 1; j := 0;
  47.     initGenrand(19650218);
  48.     IF n > length THEN k := n ELSE k := length; END;
  49.    
  50.     WHILE k # 0 DO
  51.       mt[i] := Xor(mt[i], Xor(mt[i-1], RightShift(mt[i-1], 30)) * 1664525) +
  52.                    key[j] + j;
  53.       mt[i] := And(mt[i], 16_ffffffff);
  54.       INC(i); INC(j);
  55.      
  56.       IF i >= n THEN
  57.         mt[0] := mt[n-1];
  58.         i := 1;
  59.       END;
  60.  
  61.       IF j >= length THEN
  62.         j := 0;
  63.       END;
  64.       DEC(k);
  65.     END;
  66.  
  67.     k := n - 1;
  68.     WHILE k # 0 DO
  69.       mt[i] := Xor(mt[i], Xor(mt[i-1], RightShift(mt[i-1], 30)) * 1566083941) - i;
  70.       mt[i] := And(mt[i], 16_ffffffff);
  71.       INC(i);
  72.      
  73.       IF i >= n THEN
  74.         mt[0] := mt[n-1];
  75.         i := 1;
  76.       END;
  77.       DEC(k);
  78.     END;
  79.  
  80.     mt[0] := 16_80000000;
  81.   END initByArray;
  82.  
  83. PROCEDURE genrandInt32(): Word.T =
  84.   VAR y: Word.T;
  85.       k: INTEGER := 0;
  86.       mag01 := ARRAY [0..1] OF Word.T {0, matrix_a};
  87.      
  88.   BEGIN
  89.     IF mti >= n THEN
  90.       IF mti = (n + 1) THEN
  91.         initGenrand(5489);
  92.       END;
  93.  
  94.       WHILE k < (n - m) DO
  95.         y := Or(And(mt[k], upper_mask), And(mt[k+1], lower_mask));
  96.         mt[k] := Xor(Xor(mt[k+m], RightShift(y, 1)), mag01[And(y, 1)]);
  97.         INC(k);
  98.       END;
  99.      
  100.       WHILE k < (n - 1) DO
  101.         y := Or(And(mt[k], upper_mask), And(mt[k+1], lower_mask));
  102.         mt[k] := Xor(Xor(mt[k+(m-n)], RightShift(y, 1)), mag01[And(y, 1)]);
  103.         INC(k);
  104.       END;
  105.  
  106.       y := Or(And(mt[n-1], upper_mask), And(mt[0], lower_mask));
  107.       mt[n-1] := Xor(Xor(mt[m-1], RightShift(y, 1)), mag01[And(y, 1)]);
  108.       mti := 0;
  109.     END;
  110.  
  111.     y := mt[mti];
  112.     INC(mti);
  113.  
  114.     y := Xor(y, RightShift(y, 11));
  115.     y := Xor(y, And(LeftShift(y, 7), 16_9d2c5680));
  116.     y := Xor(y, And(LeftShift(y, 15), 16_efc60000));
  117.     y := Xor(y, RightShift(y, 18));
  118.  
  119.     RETURN y;
  120.   END genrandInt32;
  121.  
  122. PROCEDURE genrandInt31(): INTEGER =
  123.   BEGIN
  124.     RETURN RightShift(genrandInt32(), 1);
  125.   END genrandInt31;
  126.  
  127. PROCEDURE genrandReal1(): LONGREAL =
  128.   BEGIN
  129.     RETURN FLOAT(genrandInt32(), LONGREAL) * (1.0D0 / 4294967295.0D0);
  130.   END genrandReal1;
  131.  
  132. PROCEDURE genrandReal2(): LONGREAL =
  133.   BEGIN
  134.     RETURN FLOAT(genrandInt32(), LONGREAL) * (1.0D0 / 4294967296.0D0);
  135.   END genrandReal2;
  136.  
  137. PROCEDURE genrandReal3(): LONGREAL =
  138.   BEGIN
  139.     RETURN (FLOAT(genrandInt32(), LONGREAL) + 0.5D0) * (1.0D0 / 4294967296.0D0);
  140.   END genrandReal3;
  141.  
  142. BEGIN
  143. END MT19937ar.
  144.  
  145. (**********************************)
  146.  
  147. MODULE Main;
  148.  
  149. IMPORT IO, Fmt, MT19937ar;
  150.  
  151. VAR init := ARRAY [0..3] OF INTEGER {16_123, 16_234, 16_345, 16_456};
  152.     len := 4;
  153.  
  154. BEGIN
  155.   MT19937ar.initByArray(init, len);
  156.   IO.Put("Random integers: ");
  157.   FOR i := 1 TO 999 DO
  158.     IO.Put(Fmt.Unsigned(MT19937ar.genrandInt32(), base := 10));
  159.     IO.Put(" ");
  160.     IF (i MOD 5) = 4 THEN IO.Put("\n"); END;
  161.   END;
  162.   IO.Put("\n");
  163. END Main.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement