Raku does not have unsigned Integers at this time (Integers are arbitrary sized) so use explicit bit masks during bitwise operations. All constants are encapsulated inside the class.
class Xorshift-star { has $!state; submethod BUILD ( Int :$seed where * > 0 = 1 ) { $!state = $seed } method next-int { $!state +^= $!state +> 12; $!state +^= $!state +< 25 +& (2⁶⁴ - 1); $!state +^= $!state +> 27; ($!state * 0x2545F4914F6CDD1D) +> 32 +& (2³² - 1) } method next-rat { self.next-int / 2³² }}# Test next-intsay'Seed: 1234567; first five Int values';my $rng = Xorshift-star.new( :seed(1234567) );.sayfor $rng.next-int xx 5;# Test next-rat (since these are rational numbers by default)say"\nSeed: 987654321; first 1e5 Rat values histogram";$rng = Xorshift-star.new( :seed(987654321) );say ( ($rng.next-rat * 5).floor xx 100_000 ).Bag;# Test with default seedsay"\nSeed: default; first five Int values";$rng = Xorshift-star.new;.sayfor $rng.next-int xx 5;
Output:
Seed: 1234567; first five Int values
3540625527
2750739987
4037983143
1993361440
3809424708
Seed: 987654321; first 1e5 Rat values histogram
Bag(0(20103), 1(19922), 2(19937), 3(20031), 4(20007))
Seed: default; first five Int values
1206177355
2882512552
3117485455
1303648416
241277360