# `nupp.random`
Deterministic pseudo-random generation with explicit, serializable state.
Each `Random` owns an independent xoshiro128** sequence. A seed is always
interpreted as one 32-bit word, and omitting it chooses a fixed seed rather
than consulting a clock, so every sequence is reproducible. Generators are
mutable and intentionally not safe to share between concurrent workers.
```nupp
local random = require("nupp.random")
local dice = random.newRandom(42)
local d20 = dice:integer(20)
local unit = dice:next()
```
`state` and `setState` copy the four signed 32-bit state words. They are the
portable checkpoint format: preserving them preserves the next draw exactly.
## Constructors
### `newRandom` _constructor_
```nupp
function newRandom(seed: integer?): Random
```
Creates a generator outside any host or scheduler.
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `seed` | `integer?` | |
#### Returns
| Type | Description |
| --- | --- |
| `Random` | |
## Types
### `Random` _record_
```nupp
record Random
constructor(self, seed: integer?) end
function next(self): number end
function integer(self, m: integer, n: integer?): integer end
function range(self, low: number, high: number): number end
function shuffle(self, values: {T}): {T} end
function reseed(self, seed: integer): nil end
function state(self): {integer} end
function setState(self, words: {integer}): nil end
end
```
An independent deterministic xoshiro128** sequence.
#### Methods
##### `constructor`
```nupp
constructor: function constructor(self, seed: integer?)
```
Creates a generator. An omitted seed uses a fixed reproducible value.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `self` | `any` | |
| `seed` | `integer?` | |
##### `next`
```nupp
next: function next(self): number
```
Returns the next multiple of 2^-32 in [0, 1).
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `self` | `any` | |
###### Returns
| Type | Description |
| --- | --- |
| `number` | |
##### `integer`
```nupp
integer: function integer(self, m: integer, n: integer?): integer
```
Returns an integer in [1, m], or in [m, n] when both are given.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `self` | `any` | |
| `m` | `integer` | |
| `n` | `integer?` | |
###### Returns
| Type | Description |
| --- | --- |
| `integer` | |
###### Raises
- when the selected range is empty
##### `range`
```nupp
range: function range(self, low: number, high: number): number
```
Returns the next value in [low, high), or (high, low] when reversed.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `self` | `any` | |
| `low` | `number` | |
| `high` | `number` | |
###### Returns
| Type | Description |
| --- | --- |
| `number` | |
##### `shuffle`
```nupp
shuffle: function shuffle(self, values: {T}): {T}
```
Shuffles a list in place with Fisher-Yates and returns the same list.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `self` | `any` | |
| `values` | `{T}` | |
###### Returns
| Type | Description |
| --- | --- |
| `{T}` | |
##### `reseed`
```nupp
reseed: function reseed(self, seed: integer): nil
```
Restarts this generator from a 32-bit seed without changing its identity.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `self` | `any` | |
| `seed` | `integer` | |
###### Returns
| Type | Description |
| --- | --- |
| `nil` | |
##### `state`
```nupp
state: function state(self): {integer}
```
Copies the four signed 32-bit state words into a fresh array.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `self` | `any` | |
###### Returns
| Type | Description |
| --- | --- |
| `{integer}` | |
##### `setState`
```nupp
setState: function setState(self, words: {integer}): nil
```
Restores exactly four state words.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `self` | `any` | |
| `words` | `{integer}` | |
###### Returns
| Type | Description |
| --- | --- |
| `nil` | |
###### Raises
- when there are not four words or all four are zero