Re: [HACKERS] random() function produces wrong range
Tom Lane <tgl@sss.pgh.pa.us>
From: Tom Lane <tgl@sss.pgh.pa.us>
To: Malcolm Beattie <mbeattie@sable.ox.ac.uk>
Cc: Thomas Lockhart <lockhart@alumni.caltech.edu>, pgsql-hackers@postgresql.org, pgsql-general@postgresql.org
Date: 2000-08-02T20:36:20Z
Lists: pgsql-hackers
Malcolm Beattie <mbeattie@sable.ox.ac.uk> writes: > Tom Lane writes: >> Thomas Lockhart <lockhart@alumni.caltech.edu> writes: >>>> The Linux man pages indicate that the behavior and underlying >>>> implementation of random() and rand() are the same (so I just picked >>>> one). >> >> Ah, well, there's your problem. Whoever did this part of the library >> on Linux took shortcuts. > Why? Linux is compliant with the Single Unix Standard v2 from my brief > reading of it. Sorry, bad choice of words on my part. Linux is within its rights to use the same underlying implementation for rand() and random(), but it is a poor guide to the behavior of other systems, which are equally within their rights not to. >> none of the man pages I've looked at so far mention it). But all the >> machines say that the output of random() is 31 bits, so INT_MAX should >> work. > SuSv2 says explicitly 2^31-1 so you should use that, otherwise you'll > be non-portable to platforms with 64-bit ints, for example. Maybe. You don't think that a 64-bit-int platform would choose to supply a random() function with a range of 2^63-1? The HPUX and SunOS man pages clearly specify that random()'s result is "long", so I think a case could also be made for LONG_MAX. I suspect we have a good chance at getting burned no matter what we use :-(. But RAND_MAX is definitely the wrong thing. regards, tom lane