1*37da2899SCharles.Forsythimplement Rand; 2*37da2899SCharles.Forsyth 3*37da2899SCharles.Forsythinclude "rand.m"; 4*37da2899SCharles.Forsyth 5*37da2899SCharles.Forsythrsalt: big; 6*37da2899SCharles.Forsyth 7*37da2899SCharles.Forsythinit(seed: int) 8*37da2899SCharles.Forsyth{ 9*37da2899SCharles.Forsyth rsalt = big seed; 10*37da2899SCharles.Forsyth} 11*37da2899SCharles.Forsyth 12*37da2899SCharles.ForsythMASK: con (big 1<<63)-(big 1); 13*37da2899SCharles.Forsyth 14*37da2899SCharles.Forsythrand(modulus: int): int 15*37da2899SCharles.Forsyth{ 16*37da2899SCharles.Forsyth rsalt = rsalt * big 1103515245 + big 12345; 17*37da2899SCharles.Forsyth if(modulus <= 0) 18*37da2899SCharles.Forsyth return 0; 19*37da2899SCharles.Forsyth return int (((rsalt&MASK)>>10) % big modulus); 20*37da2899SCharles.Forsyth} 21*37da2899SCharles.Forsyth 22*37da2899SCharles.Forsyth# 0 < modulus < 2^53 23*37da2899SCharles.Forsythbigrand(modulus: big): big 24*37da2899SCharles.Forsyth{ 25*37da2899SCharles.Forsyth rsalt = rsalt * big 1103515245 + big 12345; 26*37da2899SCharles.Forsyth if(modulus <= big 0) 27*37da2899SCharles.Forsyth return big 0; 28*37da2899SCharles.Forsyth return ((rsalt&MASK)>>10) % modulus; 29*37da2899SCharles.Forsyth} 30