aboutsummaryrefslogtreecommitdiff
path: root/README.md
diff options
context:
space:
mode:
Diffstat (limited to 'README.md')
-rw-r--r--README.md196
1 files changed, 196 insertions, 0 deletions
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..c71378f
--- /dev/null
+++ b/README.md
@@ -0,0 +1,196 @@
+# oorandom
+
+[![Crates.io](https://img.shields.io/crates/v/oorandom.svg)](https://crates.io/crates/oorandom)
+[![Docs](https://docs.rs/oorandom/badge.svg)](https://docs.rs/oorandom)
+[![builds.sr.ht status](https://builds.sr.ht/~icefox/oorandom.svg)](https://builds.sr.ht/~icefox/oorandom?)
+
+# What is this?
+
+`oorandom` is a minimalistic pseudorandom number generator in Rust. For
+those times when the `rand` crate is just too big and you want something
+a bit dumber.
+
+More specifically, it implements ONE prng, which is currently a permuted
+congruential generator (PCG). It may change if something better comes
+along, but that seems unlikely and will probably be a major version
+bump. It will give you `u32` or `u64`, and signed or floating-point
+equivalents. It is also `#[no_std]`. Anything else is gravy.
+
+Thanks to Lokathor for making
+[`randomize`](https://github.com/Lokathor/randomize), which inspired me
+to do my own equivalent.
+
+The name comes from my attempts to find a good way to pronounce
+`/dev/urandom`.
+
+Please direct questions, discussions and bugs to the [issue
+tracker](https://todo.sr.ht/~icefox/oorandom).
+
+# Why use `oorandom` instead of...
+
+ * `rand` -- `oorandom` is simpler and has zero choices you need to
+ make. It also compiles in 1/10th the time and has a stable API.
+ * `getrandom` -- They solve different problems; `getrandom` gives you
+ whatever secure randomness the OS decides to give you, not a
+ deterministic and seedable PRNG. It's generally a good idea to use
+ `getrandom` to seed this RNG though.
+ * `randomize` -- `randomize` used to be more complicated, but
+ `randomize` 3.x is quite similar to `oorandom` in functionality and
+ design. Go for it.
+ * `rand_pcg` and `rand_core` -- Yes you can take `rand` apart into its
+ pieces and use those individually, if you want to abandon having an
+ all-in-one solution, still deal with the lack of stability in
+ `rand_core` and actually figure out which pieces you need. It works
+ just fine. Seems more complicated than it needs to be though.
+ * `nanorand` -- `nanorand` uses the
+ [WyRand](https://github.com/wangyi-fudan/wyhash) PRNG algorithm,
+ which is supposedly faster than PCG and at least as good quality. I
+ haven't verified these claims, and I don't know of any *really*
+ thorough 3rd party investigation into them, though it apparently
+ passes [Dr. Lemire's tests](https://github.com/lemire/testingRNG).
+ So for now I personally consider WyRand to be in the "trust but
+ verify" level of quality. It's probably fine.
+
+# This is not...
+
+This is not cryptographically secure, and if you use it for crypto you
+will get what you deserve. You are also in charge of choosing a useful
+seed; the `getrandom` crate might be useful for that.
+
+This is also not optimized to be stupidly fast, but is basically just
+as fast as `rustc` feels like making it. This means it is safe and robust
+and portable and involves absolutely zero clever tricks.
+
+# Usage
+
+```rust
+use oorandom;
+fn main() {
+ let some_seed = 4;
+ let mut rng = oorandom::Rand32::new(some_seed);
+ println!("Your random number is: {}", rng.rand_float());
+}
+```
+
+If you want a nondeterministic seed, I recommend using the `getrandom` crate to produce one.
+
+# License
+
+MIT
+
+# A brief history of random numbers
+
+The usefulness of random numbers has been known for a long, long time
+to people who also knew how to use slide rules. If you wanted to do
+some math without the bother of coming up with all that pesky input
+data from the real world, you might as well just use any ol' random numbers,
+as long as there weren't any patterns in them to heck up the patterns you were
+trying to look at. So in the first half
+of the 20th century you had little old ladies named Edith spinning
+roulette wheels or pulling bingo balls out of baskets and writing the
+results down, which got assembled into giant tomes and published so
+that engineering schools could buy them and have giant tomes sitting
+on their shelves. Anyone who wanted some meaningless numbers could
+pull the tome down, flip it open to a presumably-random page, and
+there were all the random numbers anyone could want. The problem was
+solved, and life was good.
+
+In late 1940's computers were invented, but they were far too big and
+expensive to be put on the task of *intentionally* generating
+nonsense, and things carried on as before. If you needed random
+numbers in a computer program, you just got a pretty young lady named
+Mary to transcribe part of the book to punch cards for you.
+
+Around the early 1960's computers got fast enough that Edith and Mary
+couldn't keep up with them, so they got downsized and replaced with
+more computers. To do this people came up with Linear Congruential
+Generators (LCG's), which could generate lots of numbers numbers that
+weren't really random, but sure looked random. LCG's worked well on
+computers that even a second-rate university could afford, and so the
+problem was solved, and life was good.
+
+At some unknown point in here, presumably sometime in the 60's or 70's,
+someone seems to have invented Linear Feedback Shift Registers (LFSR's)
+as well. These made random-looking numbers and were really easy to
+implement in hardware compared to the LCG, which needed to do
+complicated things like multiply numbers. The random-looking numbers
+made by LFSR's were good enough for hardware people, so they started
+using LFSR's whenever they needed to and never looked back.
+
+Anyway, by the late 60's people who knew how to use slide rules had
+realized that using numbers that only *looked* random could really heck
+up their math pretty bad, and one of the more common LCG implmentations,
+RANDU, was actually about as bad as possible. So, just using any old
+LCG wasn't good enough, you had to use one made by someone with a PhD in
+mathematics. Donald Knuth shook his fist at the world and shouted "Hah!
+I told you so!", published a book on how to do it Right that most people
+didn't read, and then went back into his Fortress of Solitude to write
+TeX. Because it was created by IBM, RANDU's awfulness is now enshrined
+forever in history documents like this one, and because the people
+writing OS's and programming languages at the time weren't actually
+doing much slide-rule stuff anymore and didn't actually *need* very good
+random-looking numbers, everyone went back to using whatever old crap
+RNG they were using anyway. The problem was solved, or at least not
+terribly problematic, and life was good.
+
+Also, sometime in the 70's or 80's the arts of cryptography started
+leaking from classified government works into the real world. People
+started thinking about how much money they could make from scrambling
+satellite TV so that plebs with HAM radio licenses couldn't watch it,
+and these people started giving more money to people who had PhD's in
+mathematics to figure out how to make this work. It was quickly
+determined that neither LCG's nor LFSR's made numbers that were
+random-looking enough to really get in the way of someone who knew how
+to use a slide rule, and since Edith had long ago retired to a small
+beach house in New Jersey, they needed to figure out how to get
+computers to make better random-looking numbers. But making numbers
+look random enough that someone couldn't undo the process and get free
+pay-per-view was slow and involved lots of details that nobody else
+really cared about, so that topic went off on its own adventures and
+will not be further mentioned.
+
+Things more or less trundled along this way until the late 90's, when
+suddenly computers were everywhere and there was a new generation of
+people who had grown up too late to know how to use slide rules, so they
+did all their math with computers. They were doing a LOT of math by
+now, and they looked around and realized that their random-looking
+numbers really weren't very random-looking at all, and this was actually
+something of a problem by now. So the Mersenne Twister got invented.
+It was pretty slow and used a lot of memory and made kinda mediocre
+random numbers, but it was way better than a bad LCG, and most
+importantly, it had a cool name. Most people didn't want to read Knuth's
+book and figure out how to make a non-bad LCG, so everyone started using
+the Mersenne Twister whenever possible. The problem was solved, and
+life was good.
+
+This is where things stood until the early 2010's, when I finished my MS
+and started paying attention again. People suddenly realized it was
+possible to make random-looking numbers better than the Mersenne Twister
+using an algorithm called xorshift. Xorshift was fast, it made good
+pretty random-looking numbers, and it didn't need a whole 3 kilobytes of
+state just sitting around taking up space and causing comment among the
+neighbors at church. It did sometimes have problems with some of its
+numbers not looking random enough in a few select circumstances, but
+people were gun-shy about their randomness by now so a few people with
+PhD's in mathematics slowly and patiently spent years figuring out ways
+to work around these problems, leading to a whole confusing family of
+related things such as xoshiro, xoroshiro, xoroshiro+, xoroshiro*, and
+so on. Nobody else could really tell the difference between them, but
+everyone agreed they were better than Mersenne Twister, easier to
+implement, and the name was nearly as cool. Many papers were published,
+the problem was solved, and life was good.
+
+However, at about the same time some bright young spark figured out that
+it actually wasn't too hard, if you read Knuth's book and thought real
+hard about what you were doing, to take the old LCG and hop it up on
+cocaine and moon juice. The result got called the Permuted Congruential
+Generator, or PCG. This quite miffed the people working on xorshift
+generators by being almost as small and fast, and producing
+random-looking numbers that satisfied even the people who had learned to
+use slide rules for fun in this latter age. It also used xor's and bit
+shifts, and that's xorshift's turf, dammit, it's right in the name!
+Since nobody had figured out any downsides to PCG's yet, everyone
+shrugged and said "might as well just go with that then", and that is
+where, as of 2019, the art currently stands. The problem is solved, and
+life is good.
+