I will add or add to/modify the following three randoms to the wiki, I already have such code including code that uses rdseed/rdrand or hwrng to seed the standard random:
/dev/random, /dev/urandom that take entropy from several sources on nixes. Including the use of hwrng if available. There is already an entry.
https://en.wikipedia.org/wiki//dev/randomMicrosoft's cryptgenrandom that take entropy from several sources on nixes. Including the use of hwrng if available.
https://en.wikipedia.org/wiki/CryptGenRandomhwrng if availabale on a system (e.g. Raspberry Pi, modern intel. This is true hardware random that takes entropy from physics behavior on the chip
e.g.
https://sites.google.com/site/astudyofentropy/project-definition/raspberry-pi-internal-hardware-random-number-generatorI have an article ready but my health failed badly and I needed to add a few more examples.
Note the standard random functions will always be a PRNG and possible always the mersenne twister. This is because its purpose also lies in statstics and must be reproducable:
Given the same seed it *must* produce the same random series.True random is available through other means already and is not repeatable. Its purpose lies e.g. in cryptography.
I already added a number of alternative PRNG's to the wiki for e.g. Delphi compatible random and e.g. superfast prng's for gaming etc.
I also provided a patch in trunk for a generic version of RandomFrom
Further note the the OS, both Windows and nixes (IIRC except BSD), already use hwrng/rdrand/rdseed as a source of entropy for resp. CryptGenRandom and /dev/random /dev/urandom so to some extend a separate function is not required.
Also note hwrnd/rdrand/rdseed are slow, hence if some speed is required it is best to use them just to seed a quality PRNG like the mersenne twister or KISS.
A simple example for linux:
program hwrndtest;
{takes a hwrng value if present and seeds Randseed with it.}
{$ifdef fpc}{$mode delphi}{$H+}{$I-}{$endif}
uses sysutils,classes;
var
L:TFilestream;
begin
if fileexists('/dev/hwrng') then
begin
L:= TFilestream.create('/dev/hwrng', fmOpenread);
try
RandSeed:=L.ReadDword;
finally
writeln(RandSeed);
L.Free;
end;
end else
writeln('no hardware rng present');
end.