I am currently putting together a few fast, small-footprint and good quality random generators for MonteCarlo simulations. My favourite candidate used to be George Marsaglias MWC as posted by Eric, just in plain Pascal. On my laptop, it takes 1.2ns per call (32bit) in a micro-benchmark.
I recently replaced it by Bob Jenkin's "no nice math" small chaotic generator. This is based on random invertible mappings and produces excellent quality numbers at 0.9ns per call (
www.burtleburtle.net). There is one issue with that sort of generators: they have no fixed period and have a small risk of falling into shorter cycles, in theory down to 1. The risk is however astronomically small and not of any practical concern. You'll find an extensive review and test results on Melissa O'Neills page
https://www.cs.hmc.edu/~oneill/.
A very similar generator is Chris Doty-Humphrey's SFC. By feeding a counter into the mapping stage, he can guarantee a minimum period of 2^32. On my machine, it achieves similar performance as Bob Jenkin's.
My priority is speed, so I made a reduced version with smaller state. It takes 0.73ns per call at still very good statistical quality. It may not pass the Crush tests because the state is simply too small but even the 16-bit version passes Rabbit at 1GB file size, so it is good enough for my purpose. You may be able to shave it down to 0.5ns per call by removing one roldword step, of course at the cost of quality.
Here is the code, without randomisation or anything else around.
function RNG_Tiny: dword; inline;
const state: record A,B,C: dword end = (A:12; b:12376; C:8763);
begin
with state do begin
c := c+1;
b := a+roldword (b,18);
a := roldword (a,7) + b+c;
result := a;
end;
end;
EDIT: Simply by removing the counter (c), the performance goes up to 0.5ns/call, or 2 billion values per second, on a single core of a CPU with 2.5GHz core speed. I think this is the fastest you can possibly get. The generator still passes the rabbit tests; the price for omitting the counter is factor 2^32 shorter period, and no minimum period can be guaranteed. It is possible that with certain seed values the generator falls into shorter cycles than average (average should be around 2^62). That should hardly be of concern for your application.