linear_congruential_generator.sf 714 B

123456789101112131415161718192021222324252627282930313233
  1. #!/usr/bin/ruby
  2. module LCG {
  3. # Creates a linear congruential generator and remembers the initial seed.
  4. class Common(seed) {
  5. has r = seed
  6. }
  7. # LCG::Berkeley generates 31-bit integers using the same formula
  8. # as BSD rand().
  9. class Berkeley < Common {
  10. method rand {
  11. self.r = ((1103515245 * self.r + 12345) & 0x7fff_ffff);
  12. }
  13. }
  14. # LCG::Microsoft generates 15-bit integers using the same formula
  15. # as rand() from the Microsoft C Runtime.
  16. class Microsoft < Common {
  17. method rand {
  18. self.r = ((214013 * self.r + 2531011) & 0x7fff_ffff);
  19. self.r >> 16;
  20. }
  21. }
  22. }
  23. var lcg1 = LCG::Berkeley(1)
  24. say 5.of { lcg1.rand }
  25. var lcg2 = LCG::Microsoft(1)
  26. say 5.of { lcg2.rand }