Math::R...m::ISAAC(3)

๐Ÿ’– Math::Random::ISAAC(3) โ€” the Perl interface to the ISAAC PRNG algorithm, bestie โœจ

Okay so this is the manual page for Math::Random::ISAAC from the User Contributed Perl Documentation, and it's giving very specific chaotic-genius energy. Version 1.004, and we're about to get into it. No cap. ๐Ÿซถ


๐ŸŒธ NAME ๐ŸŒธ

Math::Random::ISAAC โ€” Perl interface to the ISAAC PRNG algorithm, periodt. ๐Ÿ’…


โœจ VERSION โœจ

version 1.004 โ€” that's the one, bestie. ๐ŸŽ€


๐Ÿฆ‹ SYNOPSIS ๐Ÿฆ‹

Lowkey the whole vibe in one little code block:

use Math::Random::ISAAC;

my $rng = Math::Random::ISAAC->new(@seeds);

for (0..30) {
  print 'Result: ' . $rng->irand() . "\n";
}

That's literally it. You make one, you loop, you print numbers. Slay. ๐Ÿ”ฅ


๐ŸŒˆ DESCRIPTION ๐ŸŒˆ

So like, other Pseudo-Random Number Generator (PRNG) algorithms exist โ€” think the Mersenne Twister (see Math::Random::MT) โ€” and their whole thing is taking some seed info and producing seemingly random output. Same basic idea here, but ISAAC has different goals, okay? ๐Ÿ‘‘

ISAAC stands for Indirection, Shift, Accumulate, Add, and Count (iykyk), and it's really fast โ€” on average it needs only 18.75 machine cycles to generate a 32-bit value. That makes it suitable for applications where a significant amount of random data needs to be produced quickly, like solving using the Monte Carlo method or for games. It's giving main character energy at scale. โšก

The results are uniformly distributed, unbiased, and unpredictable unless you know the seed. The algorithm was published by Bob Jenkins in the late 90s and despite the best efforts of many security researchers, no feasible attacks have been found to date. Iconic behavior, honestly. ๐Ÿงš

๐Ÿ’€ USAGE WARNING ๐Ÿ’€

Okay bestie, this is important, so pay attention. There was no method supplied to provide the initial seed data by the author. On his web site, Bob Jenkins writes:

Seeding a random number generator is essentially the same problem as encrypting the seed with a block cipher.

In the same spirit, by default, this module does not seed the algorithm at all โ€” it simply fills the state with zeroes โ€” if no seed is provided. The idea is to remind users that selecting good seed data for their purpose is important, and for the module to conveniently set it to something like "localtime" behind-the-scenes hurts users in the long run, since they don't understand the limitations of doing so. It's like, tough love but make it cryptographic. ๐Ÿ˜ญ

The type of seed you might want to use depends entirely on the purpose of using this algorithm in your program in the first place. Here are some possible seeding methods, ranked by vibe (jk, they're just listed):

  1. Math::TrulyRandom โ€” The Math::TrulyRandom module provides a way of obtaining truly random data by using timing interrupts. This is probably one of the better ways to seed the algorithm. Honestly kind of obsessed. ๐Ÿ’–
  2. /dev/random โ€” Using the system random device is, in principle, the best idea, since it gathers entropy from various sources including interrupt timing, other device interrupts, etc. However, it's not portable to anything other than Unix-like platforms, and might not produce good data on some systems. ๐Ÿ™ˆ
  3. localtime() โ€” This works for basic things like simulations, but results in not-so-random output, especially if you create new instances quickly (as the seeds would be the same within per-second resolution). Lowkey a trap but okay. ๐Ÿ•ฐ๏ธ
  4. Time::HiRes โ€” In theory, using Time::HiRes is the same as option (2), but you get a higher resolution time so you're less likely to have the same seed twice. Note that you need to transform the output into an integer somehow, perhaps by taking the least significant bits or using a hash function. This would be less prone to duplicate instances, but it's still not ideal. Close but no cigar. ๐ŸŽ€

๐Ÿ‘‘ METHODS ๐Ÿ‘‘

๐ŸŒŸ new

Math::Random::ISAAC->new( @seeds )

Creates a Math::Random::ISAAC object, based upon either the optimized C/XS version of the algorithm, Math::Random::ISAAC::XS, or falls back to the included Pure Perl module, Math::Random::ISAAC::PP. Bestie is flexible like that. ๐Ÿ’…

Example code:

my $rng = Math::Random::ISAAC->new(time);

This method will return an appropriate Math::Random::ISAAC object or throw an exception on error. No silent failures, we love transparency. โœจ

๐ŸŒธ rand

$rng->rand()

Returns a random double-precision floating point number which is normalized between 0 and 1 (inclusive; it's a closed interval). So like, it can literally be exactly 0 or exactly 1, not just "between." Inclusive queen. ๐Ÿซถ

Internally, this simply takes the uniformly distributed unsigned integer from "$rng->irand()" and divides it by "2**32-1" (maximum unsigned integer size). Math is mathing. ๐Ÿงฎ

Example code:

my $next = $rng->rand();

This method will return a double-precision floating point number or throw an exception on error. Periodt. ๐Ÿ’–

๐Ÿฆ‹ irand

$rng->irand()

Returns the next unsigned 32-bit random integer. It will return a value with a value such that: 0 <= x <= 2**32-1. That's the whole range, no cap. ๐Ÿ”ฅ

Example code:

my $next = $rng->irand();

This method will return a 32-bit unsigned integer or throw an exception on error. Slay. ๐Ÿ’œ


โญ PURPOSE โญ

The intent of this module is to provide single simple interface to the two compatible implementations of this module, namely, Math::Random::ISAAC::XS and Math::Random::ISAAC::PP. One interface to rule them all, basically. ๐Ÿ‘‘

If, for some reason, you need to determine what version of the module is actually being included by "Math::Random::ISAAC", then:

print 'Backend type: ', $Math::Random::ISAAC::DRIVER, "\n";

In order to force use of one or the other, simply load the appropriate module:

use Math::Random::ISAAC::XS;
my $rng = Math::Random::ISAAC::XS->new();
# or
use Math::Random::ISAAC::PP;
my $rng = Math::Random::ISAAC::PP->new();

Choose your fighter. ๐ŸฅŠ


๐Ÿ’œ ACKNOWLEDGEMENTS ๐Ÿ’œ

  • Special thanks to Bob Jenkins <bob_jenkins@burtleburtle.net> for devising this very clever algorithm and releasing it into the public domain. King behavior, honestly. ๐Ÿ‘‘
  • Thanks to John L. Allen (contact unknown) for providing a Perl port of the original ISAAC code, upon which "Math::Random::ISAAC::PP" is heavily based. His version is available on Bob's web site, in the SEE ALSO section. We stan a contributor. ๐Ÿซถ

๐ŸŒˆ SEE ALSO ๐ŸŒˆ

  • Math::Random::ISAAC::XS, the C/XS optimized version of this module, which will be used automatically if available. The upgrade you didn't know you needed. โœจ
  • <http://burtleburtle.net/bob/rand/isaacafa.html>, Bob Jenkins' page about ISAAC, which explains the algorithm as well as potential attacks. Required reading, bestie. ๐ŸŽ€
  • <http://eprint.iacr.org/2006/438.pdf>, a paper entitled "On the pseudo-random generator ISAAC," which claims there are many seeds which will produce non-uniform results. The author, Jean-Philippe Aumasson, argues ISAAC should be using rotations (circular shifts) instead of normal shifts to increase diffusion of the state, among other things. Academic drama, but make it cryptography. ๐Ÿ˜ญ
  • <http://eprint.iacr.org/2001/049.pdf>, a paper by Marina Pudovkina discussing plaintext attacks on the ISAAC keystream generator. Among other things, it notes that the time complexity is Tmet = 4.67*10^1240, so it remains a secure cipher for practical applications. That number is so big it's giving "not today, hacker." ๐Ÿ’€

๐Ÿ™ˆ CAVEATS ๐Ÿ™ˆ

  • There is no method that allows re-seeding of algorithms. This is not really necessary because one can simply call "new" again with the new seed data periodically.

But he also provides a simple workaround:

As ISAAC is intended to be a secure cipher, if you want to reseed it, one way is to use some other cipher to seed some initial version of ISAAC, then use ISAAC's output as a seed for other instances of ISAAC whenever they need to be reseeded.

So like, you can't reseed directly but you can absolutely finesse it. ๐Ÿ’…

  • There is no way to clone a PRNG instance. I'm not sure why this is might even be necessary or useful. File a bug report with an explanation why and I'll consider adding it to the next release. (That typo is in the original, and honestly? Relatable. We keep it. ๐Ÿซถ)

๐Ÿ› BUGS ๐Ÿ›

Please report any bugs or feature requests on the bugtracker website http://rt.cpan.org/NoAuth/Bugs.html?Dist=Math-Random-ISAAC. Do your civic duty, bestie. ๐Ÿ’–

When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature. Help them help you. ๐ŸŽ€


โœจ AUTHOR โœจ

Jonathan Yu <jawnsy@cpan.org> โ€” the main character who made this happen. ๐Ÿ‘‘


Legally speaking, this package and its contents are:

Copyright (c) 2011 by Jonathan Yu <jawnsy@cpan.org>.

But this is really just a legal technicality that allows the author to offer this package under the public domain and also a variety of licensing options. For all intents and purposes, this is public domain software, which means you can do whatever you want with it. Free real estate. ๐Ÿฆ‹

The software is provided "AS IS", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the software. Basically: don't come for them if it breaks, okay? ๐Ÿ’€


๐ŸŽ€ And that's the whole page, bestie. This was Math::R...m::ISAAC(3) from perl v5.42.0, dated 2018-01-24. Go forth and generate random numbers responsibly. Slay. ๐Ÿ’…โœจ
๐Ÿ“ฆ where this page comes from