Pseudo-random numbers/Xorshift star: Difference between revisions

m (→‎{{header|Raku}}: over enthusiastic copy/paste)
Line 234:
3809424708
0: 20103 1: 19922 2: 19937 3: 20031 4: 20007
</pre>
 
=={{header|Phix}}==
As per [[Pseudo-random_numbers/PCG32#Phix]], resorting to mpfr/gmp
<lang Phix>include mpfr.e
mpz const = mpz_init("0x2545F4914F6CDD1D"),
state = mpz_init(),
b64 = mpz_init("0x10000000000000000"), -- (truncate to 64 bits)
b32 = mpz_init("0x100000000"), -- (truncate to 32 bits)
tmp = mpz_init(),
x = mpz_init()
procedure seed(integer num)
mpz_set_si(state,num)
end procedure
 
function next_int()
mpz_set(x,state) -- x := state
mpz_tdiv_q_2exp(tmp, x, 12) -- tmp := trunc(x/2^12)
mpz_xor(x, x, tmp) -- x := xor_bits(x,tmp)
mpz_mul_2exp(tmp, x, 25) -- tmp := x * 2^25.
mpz_xor(x, x, tmp) -- x := xor_bits(x,tmp)
mpz_fdiv_r(x, x, b64) -- x := remainder(x,b64)
mpz_tdiv_q_2exp(tmp, x, 27) -- tmp := trunc(x/2^27)
mpz_xor(x, x, tmp) -- x := xor_bits(x,tmp)
mpz_fdiv_r(state, x, b64) -- state := remainder(x,b64)
mpz_mul(x,x,const) -- x *= const
mpz_tdiv_q_2exp(x, x, 32) -- x := trunc(x/2^32)
mpz_fdiv_r(x, x, b32) -- x := remainder(x,b32)
return mpz_get_atom(x)
end function
 
function next_float()
return next_int() / (1 << 32)
end function
seed(1234567)
for i=1 to 5 do
printf(1,"%d\n",next_int())
end for
seed(987654321)
sequence r = repeat(0,5)
for i=1 to 100000 do
r[floor(next_float()*5)+1] += 1
end for
?r</lang>
{{out}}
<pre>
3540625527
2750739987
4037983143
1993361440
3809424708
{20103,19922,19937,20031,20007}
</pre>
 
7,822

edits