DoxigAlpha

int

Returns a random int i such that minInt(T) <= i <= maxInt(T). i is evenly distributed.

Function parameters

Parameters

#
T:type

Fast unbiased random numbers.

Types

#
DefaultPrng
Fast unbiased random numbers.
DefaultCsprng
Cryptographically secure random numbers.

Functions in this namespace

Functions

#
bytes
Read random bytes into the specified buffer until full.
enumValue
Returns a random value from an enum, evenly distributed.
enumValueWithIndex
Returns a random value from an enum, evenly distributed.
int
Returns a random int `i` such that `minInt(T) <= i <= maxInt(T)`.
uintLessThanBiased
Constant-time implementation off `uintLessThan`.
uintLessThan
Returns an evenly distributed random unsigned integer `0 <= i < less_than`.
uintAtMostBiased
Constant-time implementation off `uintAtMost`.
uintAtMost
Returns an evenly distributed random unsigned integer `0 <= i <= at_most`.
intRangeLessThanBiased
Constant-time implementation off `intRangeLessThan`.
intRangeLessThan
Returns an evenly distributed random integer `at_least <= i < less_than`.
intRangeAtMostBiased
Constant-time implementation off `intRangeAtMostBiased`.
intRangeAtMost
Returns an evenly distributed random integer `at_least <= i <= at_most`.
float
Return a floating point value evenly distributed in the range [0, 1).
floatNorm
Return a floating point value normally distributed with mean = 0, stddev = 1.
floatExp
Return an exponentially distributed float with a rate parameter of 1.
shuffle
Shuffle a slice into a random order.
shuffleWithIndex
Shuffle a slice into a random order, using an index of a
weightedIndex
Randomly selects an index into `proportions`, where the likelihood of each
limitRangeBiased
Convert a random integer 0 <= random_int <= maxValue(T),

Source

Implementation

#
pub fn int(r: Random, comptime T: type) T {
    const bits = @typeInfo(T).int.bits;
    const UnsignedT = std.meta.Int(.unsigned, bits);
    const ceil_bytes = comptime std.math.divCeil(u16, bits, 8) catch unreachable;
    const ByteAlignedT = std.meta.Int(.unsigned, ceil_bytes * 8);

    var rand_bytes: [ceil_bytes]u8 = undefined;
    r.bytes(&rand_bytes);

    // use LE instead of native endian for better portability maybe?
    // TODO: endian portability is pointless if the underlying prng isn't endian portable.
    // TODO: document the endian portability of this library.
    const byte_aligned_result = mem.readInt(ByteAlignedT, &rand_bytes, .little);
    const unsigned_result: UnsignedT = @truncate(byte_aligned_result);
    return @bitCast(unsigned_result);
}