| Ruby 3.5.0dev (2025-10-31 revision a6379032ee98bc43fb68ce7a6c186f3512558ce0)
    | 
#include "ruby/ruby.h"

Go to the source code of this file.
| Data Structures | |
| struct | rb_random_struct | 
| Base components of the random interface.  More... | |
| struct | rb_random_interface_t | 
| PRNG algorithmic interface, analogous to Ruby level classes.  More... | |
| Macros | |
| #define | RUBY_RANDOM_INTERFACE_VERSION_MAJOR 1 | 
| #define | RUBY_RANDOM_INTERFACE_VERSION_MINOR 0 | 
| #define | RUBY_RANDOM_PASTE_VERSION_SUFFIX(x, y, z) x##_##y##_##z | 
| #define | RUBY_RANDOM_WITH_VERSION_SUFFIX(name, major, minor) RUBY_RANDOM_PASTE_VERSION_SUFFIX(name, major, minor) | 
| #define | rb_random_data_type | 
| #define | RUBY_RANDOM_INTERFACE_VERSION_INITIALIZER {RUBY_RANDOM_INTERFACE_VERSION_MAJOR, RUBY_RANDOM_INTERFACE_VERSION_MINOR} | 
| #define | RUBY_RANDOM_INTERFACE_VERSION_MAJOR_MAX 0xff | 
| #define | RUBY_RANDOM_INTERFACE_VERSION_MINOR_MAX 0xff | 
| #define | RB_RANDOM_INTERFACE_DECLARE(prefix) | 
| This utility macro defines 4 functions named prefix_init, prefix_init_int32, prefix_get_int32, prefix_get_bytes. | |
| #define | RB_RANDOM_INTERFACE_DECLARE_WITH_REAL(prefix) | 
| Identical to RB_RANDOM_INTERFACE_DECLARE except it also declares prefix_get_real. | |
| #define | RB_RANDOM_INTERFACE_DEFINE(prefix) | 
| This utility macro expands to the names declared using RB_RANDOM_INTERFACE_DECLARE. | |
| #define | RB_RANDOM_INTERFACE_DEFINE_WITH_REAL(prefix) | 
| Identical to RB_RANDOM_INTERFACE_DEFINE except it also defines prefix_get_real. | |
| #define | RB_RANDOM_DEFINE_INIT_INT32_FUNC(prefix) | 
| #define | RB_RANDOM_PARENT &rb_random_data_type | 
| This utility macro can be used when you define your own PRNG type: | |
| #define | RB_RANDOM_DATA_INIT_PARENT(random_data) rbimpl_random_data_init_parent(&random_data) | 
| This macro is expected to be called exactly once at the beginning of a program, possibly from inside of your Init_Foo()function. | |
| Typedefs | |
| typedef struct rb_random_struct | rb_random_t | 
| typedef void | rb_random_init_func(rb_random_t *rng, const uint32_t *buf, size_t len) | 
| This is the type of functions called when your random object is initialised. | |
| typedef void | rb_random_init_int32_func(rb_random_t *rng, uint32_t data) | 
| This is the type of functions called when your random object is initialised. | |
| typedef unsigned int | rb_random_get_int32_func(rb_random_t *rng) | 
| This is the type of functions called from your object's #randmethod. | |
| typedef void | rb_random_get_bytes_func(rb_random_t *rng, void *buf, size_t len) | 
| This is the type of functions called from your object's #bytesmethod. | |
| typedef double | rb_random_get_real_func(rb_random_t *rng, int excl) | 
| This is the type of functions called from your object's #randmethod. | |
| typedef const rb_data_type_t | rb_random_data_type_t | 
| This is the type of rb_random_data_type. | |
| Functions | |
| void | rb_random_mark (void *ptr) | 
| This is the implementation of rb_data_type_struct::dmark for rb_random_data_type. | |
| void | rb_random_base_init (rb_random_t *rnd) | 
| Initialises an allocated rb_random_t instance. | |
| double | rb_int_pair_to_real (uint32_t a, uint32_t b, int excl) | 
| Generates a 64 bit floating point number by concatenating two 32bit unsigned integers. | |
| void | rb_rand_bytes_int32 (rb_random_get_int32_func *func, rb_random_t *prng, void *buff, size_t size) | 
| Repeatedly calls the passed function over and over again until the passed buffer is filled with random bytes. | |
| static const rb_random_interface_t * | rb_rand_if (VALUE obj) | 
| Queries the interface of the passed random object. | |
| Variables | |
| const rb_data_type_t | rb_random_data_type | 
| The data that holds the backend type of rb_cRandom. | |
This is a set of APIs to roll your own subclass of rb_cRandom. An illustrative example of such PRNG can be found at ext/-test-/random/loop.c. 
Definition in file random.h.
| #define RB_RANDOM_DATA_INIT_PARENT | ( | random_data | ) | rbimpl_random_data_init_parent(&random_data) | 
This macro is expected to be called exactly once at the beginning of a program, possibly from inside of your Init_Foo() function. 
Depending on platforms RB_RANDOM_PARENT can require a fixup. This routine does that when necessary.
| #define rb_random_data_type | 
| #define RB_RANDOM_DEFINE_INIT_INT32_FUNC | ( | prefix | ) | 
| #define RB_RANDOM_INTERFACE_DECLARE | ( | prefix | ) | 
This utility macro defines 4 functions named prefix_init, prefix_init_int32, prefix_get_int32, prefix_get_bytes.
| #define RB_RANDOM_INTERFACE_DECLARE_WITH_REAL | ( | prefix | ) | 
Identical to RB_RANDOM_INTERFACE_DECLARE except it also declares prefix_get_real.
| #define RB_RANDOM_INTERFACE_DEFINE | ( | prefix | ) | 
This utility macro expands to the names declared using RB_RANDOM_INTERFACE_DECLARE.
Expected to be used inside of a rb_random_interface_t initialiser:
| #define RB_RANDOM_INTERFACE_DEFINE_WITH_REAL | ( | prefix | ) | 
Identical to RB_RANDOM_INTERFACE_DEFINE except it also defines prefix_get_real.
| #define RB_RANDOM_PARENT &rb_random_data_type | 
This utility macro can be used when you define your own PRNG type:
| #define RUBY_RANDOM_INTERFACE_VERSION_INITIALIZER {RUBY_RANDOM_INTERFACE_VERSION_MAJOR, RUBY_RANDOM_INTERFACE_VERSION_MINOR} | 
| #define RUBY_RANDOM_WITH_VERSION_SUFFIX | ( | name, | |
| major, | |||
| minor | |||
| ) | RUBY_RANDOM_PASTE_VERSION_SUFFIX(name, major, minor) | 
| typedef const rb_data_type_t rb_random_data_type_t | 
| typedef void rb_random_get_bytes_func(rb_random_t *rng, void *buf, size_t len) | 
This is the type of functions called from your object's #bytes method. 
| [out] | rng | Your random struct to extract an integer from. | 
| [out] | buf | Return buffer of at least lenbytes length. | 
| [in] | len | Number of bytes of buf. | 
rng is consumed somehow. buf is filled with random bytes. | typedef unsigned int rb_random_get_int32_func(rb_random_t *rng) | 
| typedef double rb_random_get_real_func(rb_random_t *rng, int excl) | 
This is the type of functions called from your object's #rand method. 
| [out] | rng | Your random struct to extract an integer from. | 
| [in] | excl | Pass nonzero value here to indicate you don't want 1.0. | 
rng is consumed somehow. | typedef void rb_random_init_func(rb_random_t *rng, const uint32_t *buf, size_t len) | 
This is the type of functions called when your random object is initialised.
Passed buffer is the seed object basically. But in Ruby a number can be really big. This type of functions accept such big integers as a series of machine words.
| [out] | rng | Your random struct to fill in. | 
| [in] | buf | Seed, maybe converted from a bignum. | 
| [in] | len | Number of words of buf. | 
rng is initialised using the passed seeds. | typedef void rb_random_init_int32_func(rb_random_t *rng, uint32_t data) | 
| typedef struct rb_random_struct rb_random_t | 
| double rb_int_pair_to_real | ( | uint32_t | a, | 
| uint32_t | b, | ||
| int | excl | ||
| ) | 
Generates a 64 bit floating point number by concatenating two 32bit unsigned integers.
| [in] | a | Most significant 32 bits of the result. | 
| [in] | b | Least significant 32 bits of the result. | 
| [in] | excl | Whether the result should exclude 1.0 or not. | 
[0, 1) or [0, 1]. | void rb_rand_bytes_int32 | ( | rb_random_get_int32_func * | func, | 
| rb_random_t * | prng, | ||
| void * | buff, | ||
| size_t | size | ||
| ) | 
Repeatedly calls the passed function over and over again until the passed buffer is filled with random bytes.
| [in] | func | Generator function. | 
| [out] | prng | Passed as-is to func. | 
| [out] | buff | Return buffer. | 
| [in] | size | Number of words of buff. | 
buff is filled with random bytes. prng is updated by func. Definition at line 1309 of file random.c.
Referenced by rb_rand_bytes_int32().
| 
 | inlinestatic | 
Queries the interface of the passed random object.
| [in] | obj | An instance (of a subclass) of rb_cRandom. | 
| void rb_random_base_init | ( | rb_random_t * | rnd | ) | 
Initialises an allocated rb_random_t instance.
Call it from your own initialiser appropriately.
| [out] | rnd | Your PRNG's base part. | 
rnd is filled with an initial state. | void rb_random_mark | ( | void * | ptr | ) | 
This is the implementation of rb_data_type_struct::dmark for rb_random_data_type.
In case your PRNG does not involve Ruby objects at all (which is quite likely), you can simply reuse it.
| [out] | ptr | Target to mark, which is a rb_random_t this case. | 
| 
 | extern | 
The data that holds the backend type of rb_cRandom.
Used as your PRNG's rb_data_type_struct::parent.