UPDTATE: drand48
and friends are not obsolescent, and the man page no longer says they are. Apparently the change was made in response to this answer (which is kinda cool).
A git repo containing the Linux man pages is here:
https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git
The relevant log entry is:
commit 3db3ecf0ff358ab86ead91d767b8ef502bffe26b
Author: Michael Kerrisk <mtk.manpages@gmail.com>
Date: 2014-09-13 20:08:10 -0700
drand48.3: Remove crufty text about SVID 3 marking drand48() obsolete
See http://bugs.debian.org/758293
drand48() is in current POSIX. It's unclear why SVID 3 would
have marked it obsolete, but that's crufty information that
only serves to pointlessly worry people.
Reported-by: Lorenzo Beretta <lory.fulgi@infinito.it>
Signed-off-by: Michael Kerrisk <mtk.manpages@gmail.com>
See also this bug report: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=758293, which triggered the change.
My original answer follows.
The man page on my system (which is from the Linux man-pages project says:
These functions are declared obsolete by SVID 3, which states that
rand(3)
should be used instead.
SVID 3 was published in 1989.
SVID 4 (the link is to a 720-page PDF), published in 1995, documents drand48
, erand48
, lrand48
, nrand48
, mrand48
, jrand48
, srand48
, seed48
, and lcong48
and, like POSIX, says nothing about them being obsolete.
POSIX, as of 2013, says nothing about them being obsolete, obsolescent, or deprecated.
I haven't found a copy of SVID 3, so I don't know why it would have declared those functions obsolete, but apparently that decision was reconsidered later. The statement in the man page seems like out-of-date information. I wouldn't worry about it.
As for which function you should use, the C standard rand()
function is the most portable (unless you recompile a different one from source code). Some rand()
implementations are poor quality, with the low-order bits repeating in a very regular pattern; others are slightly better.
If you don't need high quality pseudo-random numbers, you might as well use rand()
(seeded by calling srand()
with a reasonable value, e.g., srand(time(NULL))
).
If you do need high-quality pseudo-random numbers, it's likely that none of these functions is good enough, I'd advise against using any of them for cryptography, for example. You can use /dev/urandom
or /dev/random
if your system supports it. I've heard good things about the Mersenne Twister, but I lack the expertise to comment further.
(BTW, if you do a Google search for SVID, watch out for Svið).