Tango has two random number generators (that are actually the same underlying one):
tango.math.Rand and tango.math.Random .
There is no reason for it.
Rand are structures, and one also supports generation of double numbers between 1 and 0, whereas Random contains a class.
I think that using a class is the right approach, the structure might have a minor speed advantage, but it is easy to "forget" to update the original structure when passing it as argument.
Due to this the sequence gets repeated, which is some cases can have very bad consequences.
To have speed it is better to use methods that set chunks of values together, those methods often can then be optimized more effectively than the ones that return the single value.
A single kind of random number generator is enough if it is a good random number generator (and KISS is such a random number generator), so if one really wants more speed it is possible to set the whole class as final (at the moment most methods are final).
Something that would be nice to have is a jumpahead method to skip a given number of elements, WichmannHill? has this (L'Ecuyer 2001 has a c++ implementation but it is not free for commercial use), but probably seeding derived generators with a master KISS generator is good enough.
If one wants also to have the system random number generator (where available) probably it makes sense to have a different interface, as its throughput is much smaller it should be used differently.
Otherwise if used correctly (using array access where needed) one could make the class (and methods) non final, but at the moment I see no need for it.
Something that one might still need is numbers with other distributions, but this can be added on the top of the current generator.
One should be able to easily have random int,uint,float,double and reals, there is no reason to use separate structures for this.
Checkpointing/saving the state and restoring it is also very important to be able to reproduce a given program behaviour.
So I had a go at Random.d and added random float,double and reals, randomize(T[]) for different T, and checkpoint ability.
I think that this makes Random much better, and makes Rand deprecated, I join a patch for it