diff --git a/vlib/rand/README.md b/vlib/rand/README.md index 211dfbaa2e..a98d966d3e 100644 --- a/vlib/rand/README.md +++ b/vlib/rand/README.md @@ -2,30 +2,59 @@ The V `rand` module provides two main ways in which users can generate pseudorandom numbers: -1. Through top-level functions in the `rand` module. - - `import rand` - Import the `rand` module. - - `rand.seed(seed_data)` to seed (optional). - - Use `rand.int()`, `rand.u32n(max)`, etc. -2. Through a generator of choice. The PRNGs are included in their respective submodules. - - `import rand.pcg32` - Import the module of the PRNG required. - - `mut rng := pcg32.PCG32RNG{}` - Initialize the struct. Note that the **`mut`** is important. - - `rng.seed(seed_data)` - optionally seed it with an array of `u32` values. - - Use `rng.int()`, `rng.u32n(max)`, etc. +## Direct Access Through The `rand` Module + +``` +// Import the rand module +import rand + +... + +// Optionally seed the default generator +rand.seed([u32(3110), 50714]) + +... + +// Use the top-level functions +rand.u32n(100) ? +rand.int() // among others ... +``` + +## Through A Generator Of Choice + +``` +// Import the rand module +import rand +import rand.seed + +// Import the module of the generator you want to use +import rand.pcg32 + +... + +// Initialise the generator struct (note the `mut`) +mut rng := &rand.PRNG(pcg32.PCG32RNG{}) + +// Optionally seed the generator +rng.seed(seed.time_seed_array(pcg32.seed_len)) + +... + +// Use functions of your choice +rng.u32n(100) ? +rng.int() // among others ... +``` + +## More Information You can change the default generator to a different one. The only requirement is that the generator must implement the `PRNG` interface. See `get_current_rng()` and `set_rng()`. -For non-uniform distributions, refer to the `rand.dist` module which defined functions for -sampling from non-uniform distributions. These functions make use of the global RNG. - **Note:** The global PRNG is not thread safe. It is recommended to use separate generators for -separate threads in multi-threaded applications. If you need to use non-uniform sampling functions, -it is recommended to generate them before use in a multi-threaded context. +separate threads in multi-threaded applications. -For sampling functions and generating random strings, see `string_from_set()` and other related -functions defined in this top-level module. - -For arrays, see `rand.util`. +There are only a few extra functions that are defined only in this top-level `rand` module. +Otherwise, there is feature parity between the generator functions and the top-level functions. # General Background @@ -38,25 +67,6 @@ This is often useful for simulations that need the same starting seed. If you need truly random numbers that are going to be used for cryptography, use the `crypto.rand` module. -# Guaranteed functions - -The following 21 functions are guaranteed to be supported by `rand` -as well as the individual PRNGs. - -- `seed(seed_data)` where `seed_data` is an array of `u32` values. - Different generators require different number of bits as the initial seed. - The smallest is 32-bits, required by `sys.SysRNG`. - Most others require 64-bits or 2 `u32` values. -- `u32()`, `u64()`, `int()`, `i64()`, `f32()`, `f64()` -- `u32n(max)`, `u64n(max)`, `intn(max)`, `i64n(max)`, `f32n(max)`, `f64n(max)` -- `u32_in_range(min, max)`, `u64_in_range(min, max)`, `int_in_range(min, max)`, - `i64_in_range(min, max)`, `f32_in_range(min, max)`, `f64_in_range(min, max)` -- `int31()`, `int63()` - -There are several additional functions defined in the top-level module that rely -on the global RNG. If you want to make use of those functions with a different -PRNG, you can can change the global RNG to do so. - # Seeding Functions All the generators are time-seeded. @@ -64,7 +74,7 @@ The helper functions publicly available in `rand.seed` module are: 1. `time_seed_array()` - returns a `[]u32` that can be directly plugged into the `seed()` functions. 2. `time_seed_32()` and `time_seed_64()` - 32-bit and 64-bit values respectively - that are generated from the current time. + that are generated from the current time. # Caveats @@ -81,7 +91,7 @@ A workaround (if you _must_ use the libc RNG) is to: # Notes -Please note that [math interval](https://en.wikipedia.org/wiki/Interval_(mathematics)#Including_or_excluding_endpoints) notation is used throughout +Please note that [math interval]() notation is used throughout the function documentation to denote what numbers ranges include. An example of `[0, max)` thus denotes a range with all posible values between `0` and `max` **including** 0 but **excluding** `max`.