---
name: "Random"
section: "3o"
platform: "linux"
package: "ocaml"
version: "5.5.0-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/Random"
---

# Random(3o)

Pseudo-random number generators (PRNG).

## NAME

Random - Pseudo-random number generators (PRNG).

## Module

Module   Random

## Documentation

Module **Random**\
  :  **sig end**

Pseudo-random number generators (PRNG).

With multiple domains, each domain has its own generator that evolves independently of the generators of other domains.  When a domain is created, its generator is initialized by splitting the state of the generator associated with the parent domain.

In contrast, all threads within a domain share the same domain-local generator.  Independent generators can be created with the  **Random.split** function and used with the functions from the  **Random.State** module.

**Before5.0** Random value generation used a different algorithm. This affects all the functions in this module which return random values.

### Basic functions

*val init* :  **int -\> unit**

Initialize the domain-local generator, using the argument as a seed. The same seed will always yield the same sequence of numbers.

*val full\_init* :  **int array -\> unit**

Same as  **Random.init** but takes more data as seed.

*val self\_init* :  **unit -\> unit**

Initialize the domain-local generator with a random seed chosen in a system-dependent way.  If a cryptographically secure pseudorandom number generator is available on the host machine, it is used to provide a highly random initial seed.  Otherwise, a less random seed is computed from system parameters (current time, process IDs, domain-local state).

*val bits* :  **unit -\> int**

Return 30 random bits in a nonnegative integer.

*val int* :  **int -\> int**

**Random.int bound** returns a random integer between 0 (inclusive) and  **bound** (exclusive).   **bound** must be greater than 0 and less than 2^30.

**Raises Invalid\_argument** if  **bound** \<= 0 or  **bound** \>= 2^30.

*val full\_int* :  **int -\> int**

**Random.full\_int bound** returns a random integer between 0 (inclusive) and  **bound** (exclusive).  **bound** may be any positive integer.

If  **bound** is less than 2^31, then  **Random.full\_int bound** yields identical output across systems with varying  **int** sizes.

If  **bound** is less than 2^30, then  **Random.full\_int bound** is equal to  **Random.int** **bound** .

If  **bound** is at least 2^30 (on 64-bit systems, or non-standard environments such as JavaScript), then  **Random.full\_int** returns a value whereas  **Random.int** raises  **Invalid\_argument** .

**Since** 4.13

**Raises Invalid\_argument** if  **bound** \<= 0.

*val int\_in\_range* :  **min:int -\> max:int -\> int**

**Random.int\_in\_range ~min ~max** returns a random integer between  **min** (inclusive) and  **max** (inclusive). Both  **min** and  **max** are allowed to be negative; **min** must be less than or equal to  **max** .

If both bounds fit in 32-bit signed integers (that is, if -2^31 \<=  **min** and  **max** \< 2^31), then  **int\_in\_range** yields identical output across systems with varying  **int** sizes.

**Since** 5.2

**Raises Invalid\_argument** if  **min \> max** .

*val int32* :  **Int32.t -\> Int32.t**

**Random.int32 bound** returns a random integer between 0 (inclusive) and  **bound** (exclusive).   **bound** must be greater than 0.

**Raises Invalid\_argument** if  **bound** \<= 0.

*val int32\_in\_range* :  **min:int32 -\> max:int32 -\> int32**

**Random.int32\_in\_range ~min ~max** returns a random integer between  **min** (inclusive) and  **max** (inclusive). Both  **min** and  **max** are allowed to be negative; **min** must be less than or equal to  **max** .

**Since** 5.2

**Raises Invalid\_argument** if  **min \> max** .

*val nativeint* :  **Nativeint.t -\> Nativeint.t**

**Random.nativeint bound** returns a random integer between 0 (inclusive) and  **bound** (exclusive).   **bound** must be greater than 0.

**Raises Invalid\_argument** if  **bound** \<= 0.

*val nativeint\_in\_range* :  **min:nativeint -\> max:nativeint -\> nativeint**

**Random.nativeint\_in\_range ~min ~max** returns a random integer between  **min** (inclusive) and  **max** (inclusive). Both  **min** and  **max** are allowed to be negative; **min** must be less than or equal to  **max** .

**Since** 5.2

**Raises Invalid\_argument** if  **min \> max** .

*val int64* :  **Int64.t -\> Int64.t**

**Random.int64 bound** returns a random integer between 0 (inclusive) and  **bound** (exclusive).   **bound** must be greater than 0.

**Raises Invalid\_argument** if  **bound** \<= 0.

*val int64\_in\_range* :  **min:int64 -\> max:int64 -\> int64**

**Random.int64\_in\_range ~min ~max** returns a random integer between  **min** (inclusive) and  **max** (inclusive). Both  **min** and  **max** are allowed to be negative; **min** must be less than or equal to  **max** .

**Since** 5.2

**Raises Invalid\_argument** if  **min \> max** .

*val float* :  **float -\> float**

**Random.float bound** returns a random floating-point number between 0 and  **bound** (inclusive).  If  **bound** is negative, the result is negative or zero.  If  **bound** is 0, the result is 0.

*val bool* :  **unit -\> bool**

**Random.bool ()** returns  **true** or  **false** with probability 0.5 each.

*val bits32* :  **unit -\> Int32.t**

**Random.bits32 ()** returns 32 random bits as an integer between **Int32.min\_int** and  **Int32.max\_int** .

**Since** 4.14

*val bits64* :  **unit -\> Int64.t**

**Random.bits64 ()** returns 64 random bits as an integer between **Int64.min\_int** and  **Int64.max\_int** .

**Since** 4.14

*val nativebits* :  **unit -\> Nativeint.t**

**Random.nativebits ()** returns 32 or 64 random bits (depending on the bit width of the platform) as an integer between **Nativeint.min\_int** and  **Nativeint.max\_int** .

**Since** 4.14

### Advanced functions

The functions from module  **Random.State** manipulate the current state of the random generator explicitly. This allows using one or several deterministic PRNGs, even in a multi-threaded program, without interference from other parts of the program.

*module State :* **sig end**

*val get\_state* :  **unit -\> State.t**

**get\_state()** returns a fresh copy of the current state of the domain-local generator (which is used by the basic functions).

The current state is unchanged, which means that random numbers generated from multiple calls to  **get\_state ()** will be identical.

See  **Random.State.make\_self\_init** and  **Random.split** instead to obtain a fresh state that is not shared.

*val set\_state* :  **State.t -\> unit**

**set\_state s** updates the current state of the domain-local generator (which is used by the basic functions) by copying the state  **s** into it.

*val split* :  **unit -\> State.t**

Draw a fresh PRNG state from the current state of the domain-local generator used by the default functions. (The state of the domain-local generator is modified.) See  **Random.State.split** .

**Since** 5.0
