package xoshiro
Xoshiro PRNGs as drop-in replacements for Stdlib.Random
Install
Dune Dependency
Authors
Maintainers
Sources
0.1.tar.gz
md5=189dfb19a24fea0fdfe9627e419eb55d
sha512=ee9ced16ea5ede0e567522e8d82e35f27924c9b922bcd342dc8becb3cf4f176b79ab77e30bf472ce61642e879552d309506b5652f411455023cb9aef5162d2ca
doc/src/xoshiro256plusplus_pure/xoshiro256plusplus_pure.ml.html
Source file xoshiro256plusplus_pure.ml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
module LowLevel = struct type t = int64 array let of_int64_array a = if Array.length a <> 4 then invalid_arg "Xoshiro256plusplus.LowLevel.of_int64_array"; Array.copy a let to_int64_array = Array.copy let rotl x k = let open Int64 in logor (shift_left x k) (shift_right_logical x (64 - k)) let next s = let open Int64 in (* const uint64_t result = rotl(s[0] + s[3], 23) + s[0]; *) let result = Int64.add (rotl (Int64.add s.(0) s.(3)) 23) s.(0) in (* const uint64_t t = s[1] << 17; *) let t = shift_left s.(1) 17 in (* s[2] ^= s[0]; *) s.(2) <- logxor s.(2) s.(0); (* s[3] ^= s[1]; *) s.(3) <- logxor s.(3) s.(1); (* s[1] ^= s[2]; *) s.(1) <- logxor s.(1) s.(2); (* s[0] ^= s[3]; *) s.(0) <- logxor s.(0) s.(3); (* s[2] ^= t; *) s.(2) <- logxor s.(2) t; (* s[3] = rotl(s[3], 45); *) s.(3) <- rotl s.(3) 45; (* return result; *) result let jump = [| 0x180ec6d33cfd0abaL; 0xd5a61266f0c9392cL; 0xa9582618e03fc9aaL; 0x39abdc4529b1661cL; |] let jump s = let open Int64 in let s0 = ref 0L in let s1 = ref 0L in let s2 = ref 0L in let s3 = ref 0L in for i = 0 to 4 - 1 do for b = 0 to 64 - 1 do if logand jump.(i) (shift_left 1L b) <> 0L then ( s0 := logxor !s0 s.(0); s1 := logxor !s1 s.(1); s2 := logxor !s2 s.(2); s3 := logxor !s3 s.(3) ); ignore (next s) done done; s.(0) <- !s0; s.(1) <- !s1; s.(2) <- !s2; s.(3) <- !s3 let long_jump = [| 0x76e15d3efefdcbbfL; 0xc5004e441c522fb3L; 0x77710069854ee241L; 0x39109bb02acbe635L; |] let long_jump s = let open Int64 in let s0 = ref 0L in let s1 = ref 0L in let s2 = ref 0L in let s3 = ref 0L in for i = 0 to 4 - 1 do for b = 0 to 64 - 1 do if logand long_jump.(i) (shift_left 1L b) <> 0L then ( s0 := logxor !s0 s.(0); s1 := logxor !s1 s.(1); s2 := logxor !s2 s.(2); s3 := logxor !s3 s.(3) ); ignore (next s) done done; s.(0) <- !s0; s.(1) <- !s1; s.(2) <- !s2; s.(3) <- !s3 end include MakeRandom.Full64(struct type state = int64 array let bits = LowLevel.next let new_state () = Array.make 4 Int64.zero let assign state1 state2 = Array.blit state2 0 state1 0 4 let init_size = 4 let init state seed = assign state seed let default_seed = 135801055 end)
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>