Xorshift_star.sf 645 B

1234567891011121314151617181920212223242526272829
  1. #!/usr/bin/ruby
  2. # https://rosettacode.org/wiki/Pseudo-random_numbers/Xorshift_star
  3. class Xorshift_star(state) {
  4. define (
  5. mask32 = (2**32 - 1),
  6. mask64 = (2**64 - 1),
  7. )
  8. method next_int {
  9. state ^= (state >> 12)
  10. state ^= (state << 25 & mask64)
  11. state ^= (state >> 27)
  12. ((state * 0x2545F4914F6CDD1D) >> 32) & mask32
  13. }
  14. method next_float {
  15. self.next_int / (mask32+1) -> float
  16. }
  17. }
  18. say 'Seed: 1234567, first 5 values:';
  19. var rng = Xorshift_star(1234567)
  20. var arr = 5.of { rng.next_int }
  21. assert_eq(arr, [3540625527, 2750739987, 4037983143, 1993361440, 3809424708])
  22. say arr