NAME

Math::BigInt::Random::OO - generate uniformly distributed Math::BigInt objects

SYNOPSIS

use Math::BigInt::Random::OO;

# Random numbers between 1e20 and 2e30:

$gen = Math::BigInt::Random::OO -> new(min => "1e20",
                                       min => "2e30");
$x = $gen -> generate();      # one number
$x = $gen -> generate(1);     # ditto
@x = $gen -> generate(100);   # 100 numbers

# Random numbers with size fitting 20 hexadecimal digits:

$gen = Math::BigInt::Random::OO -> new(length => 20,
                                       base => 16);
@x = $gen -> generate(100);

ABSTRACT

Math::BigInt::Random::OO is a module for generating arbitrarily large random integers from a discrete, uniform distribution. The numbers are returned as Math::BigInt objects.

DESCRIPTION

Math::BigInt::Random::OO is a module for generating arbitrarily large random integers from a discrete, uniform distribution. The numbers are returned as Math::BigInt objects.

CONSTRUCTORS

TODO

NOTES

The task is to generate a random integer X satisfying X_min <= X <= X_max. This is equivalent to generating a random integer U satisfying 0 <= U < U_max, where U_max = X_max - X_min + 1, and then returning X, where X = U + X_min.

The random integer U, where 0 <= U < 2**N is generated as a sequence of random bytes, except for the N % 8 most significant bits, if any. For example, if N = 21 = 5 + 8 + 8, then the 5 most significand bits are generated first, followed by two 8 bit bytes.

  |    top bits   |    first whole byte    |    second whole byte   |
    0  0  0  0  0   1  1  1  1  1  1  1  1   2  2  2  2  2  2  2  2
int(rand(1 << 5))     int(rand(1 << 8))         int(rand(1 << 8))

Problems with Math::BigInt::Random

I wrote this module partly since Math::BigInt::Random v0.04 is buggy, and in many cases slower, and partly because I prefer an object-oriented interface. The bugs in Math::BigInt::Random v0.04 are

The core of this last problem is the use of int(rand(X)), which only returns uniformly distributed numbers when X is a power of two no larger than RANDBITS.

In addition, the function Math::BigInt::Random::random_bigint() generates only one random integer at a time, and in doing so, there is some overhead. In Math::BigInt::Random::OO, this overhead is placed in the new() constructor, so it is done only once, independently of how many random numbers are generated by the generator() method.

CAVEATS

BUGS

Please report any bugs or feature requests to bug-math-bigint-random-oo at rt.cpan.org, or through the web interface at http://rt.cpan.org/Public/Bug/Report.html?Queue=Math-BigInt-Random-OO I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

SUPPORT

You can find documentation for this module with the perldoc command.

perldoc Math::BigInt::Random::OO

You can also look for information at:

SEE ALSO

Math::BigInt::Random(3), Math::Random(3), Net::Random(3).

AUTHOR

Peter John Acklam <pjacklam (at) gmail.com>.

COPYRIGHT & LICENSE

Copyright 2010,2020,2023 Peter John Acklam.

This program is free software; you may redistribute it and/or modify it under the same terms as Perl itself.