File: stdcompat__random.ml.in

package info (click to toggle)
ocaml-stdcompat 20~git20240529-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 7,540 kB
  • sloc: ml: 34,099; sh: 861; makefile: 249
file content (131 lines) | stat: -rw-r--r-- 3,268 bytes parent folder | download
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
121
122
123
124
125
126
127
128
129
130
131
@BEGIN_FROM_5_2_0@
include Random
@END_FROM_5_2_0@
@BEGIN_BEFORE_5_2_0@
module State = struct
  include Random.State

  let int_in_range state ~min ~max =
    if min > max then
      raise (Invalid_argument "int_in_range");
    min + int state (max - min + 1)

  let int32_in_range state ~min ~max =
    if Int32.compare min max > 0 then
      raise (Invalid_argument "int32_in_range");
    let ( + ), ( - ) = Int32.(add, sub) in
    min + int32 state (max - min + 1l)

  let nativeint_in_range state ~min ~max =
    if Nativeint.compare min max > 0 then
      raise (Invalid_argument "nativeint_in_range");
    let ( + ), ( - ) = Nativeint.(add, sub) in
    min + nativeint state (max - min + 1n)

  let int64_in_range state ~min ~max =
    if Int64.compare min max > 0 then
      raise (Invalid_argument "int64_in_range");
    let ( + ), ( - ) = Int64.(add, sub) in
    min + int64 state (max - min + 1L)

  @BEGIN_BEFORE_4_14_0@
  let bits32 state =
    let bits30 = Int32.of_int (bits state) in
    let add_bit bits i =
      if bool state then
        Int32.add bits (Int32.shift_left 1l i)
      else
        bits in
    let bits31 = add_bit bits30 30 in
    let bits32 = add_bit bits31 31 in
    bits32

  let bits64 state =
    let bits30 = Int64.of_int (bits state) in
    let bits60 =
      Int64.add bits30
        (Int64.shift_left (Int64.of_int (bits state)) 30) in
    let add_bit bits i =
      if bool state then
        Int64.add bits (Int64.shift_left 1L i)
      else
        bits in
    let bits61 = add_bit bits60 60 in
    let bits62 = add_bit bits61 61 in
    let bits63 = add_bit bits62 62 in
    let bits64 = add_bit bits63 63 in
    bits64

  let nativebits state =
    Int64.to_nativeint (bits64 state)
  @END_BEFORE_4_14_0@

  @BEGIN_BEFORE_4_13_0@
  let full_int state n =
    Int64.to_int (bits64 state) mod n
  @END_BEFORE_4_13_0@

  @BEGIN_BEFORE_5_1_0@
  let max_int31 = 0x3FFF_FFFF

  let split s =
    make [| int s max_int31; int s max_int31; int s max_int31; int s max_int31 |]

  let to_binary_string _ =
    failwith "not implemented"

  let of_binary_string _ =
    failwith "not implemented"
  @END_BEFORE_5_1_0@
end

let init = Random.init

let full_init = Random.full_init

let self_init = Random.self_init

let bits = Random.bits

let int = Random.int

let int32 = Random.int32

let nativeint = Random.nativeint

let int64 = Random.int64

let float = Random.float

let bool = Random.bool

let get_state = Random.get_state

let set_state = Random.set_state

let int_in_range ~min ~max = State.int_in_range (get_state ()) ~min ~max
let int32_in_range ~min ~max = State.int32_in_range (get_state ()) ~min ~max
let nativeint_in_range ~min ~max = State.nativeint_in_range (get_state ()) ~min ~max
let int64_in_range ~min ~max = State.int64_in_range (get_state ()) ~min ~max

let bits32 () = State.bits32 (get_state ())

let bits64 () = State.bits64 (get_state ())

let nativebits () = State.nativebits (get_state ())

@BEGIN_FROM_4_13_0@
let full_int = Random.full_int
@END_FROM_4_13_0@
@BEGIN_BEFORE_4_13_0@
let full_int n = State.full_int (get_state ()) n
@END_BEFORE_4_13_0@

@BEGIN_FROM_5_0_0@
let split = Random.split
@END_FROM_5_0_0@
@BEGIN_BEFORE_5_0_0@
let split () =
  get_state ()
@END_BEFORE_5_0_0@
@END_BEFORE_5_2_0@