Обсуждение: Re: Re: [GENERAL] random() function produces wrong range

Поиск
Список
Период
Сортировка

Re: Re: [GENERAL] random() function produces wrong range

От
Peter Eisentraut
Дата:
Tom Lane writes:

> Oh, that's interesting.  What platform do you use?  If RAND_MAX applies
> to random() on some machines that'd probably explain why the code is
> written like it is.  But on my box (HPUX) the rand() function is old
> and crufty and considerably different from random().

rand() and RAND_MAX are defined by ANSI C, random() is a BSD-ism. I
suggest you use the former. Also, while you're at it, this is a snippet
from the C FAQ:

13.16:  How can I get random integers in a certain range?
A:      The obvious way,               rand() % N              /* POOR */       (which tries to return numbers from 0
toN-1) is poor, because       the low-order bits of many random number generators are       distressingly *non*-random.
(See question 13.18.)  A better       method is something like               (int)((double)rand() / ((double)RAND_MAX +
1)* N)       If you're worried about using floating point, you could use               rand() / (RAND_MAX / N + 1)
Both methods obviously require knowing RAND_MAX (which ANSI       #defines in <stdlib.h>), and assume that N is much
lessthan       RAND_MAX.       (Note, by the way, that RAND_MAX is a *constant* telling you       what the fixed range
ofthe C library rand() function is.  You       cannot set RAND_MAX to some other value, and there is no way of
requestingthat rand() return numbers in some other range.)       If you're starting with a random number generator
whichreturns       floating-point values between 0 and 1, all you have to do to get       integers from 0 to N-1 is
multiplythe output of that generator       by N.       References: K&R2 Sec. 7.8.7 p. 168; PCS Sec. 11 p. 172.
 


-- 
Peter Eisentraut                  Sernanders väg 10:115
peter_e@gmx.net                   75262 Uppsala
http://yi.org/peter-e/            Sweden



Re: Re: [GENERAL] random() function produces wrong range

От
Tom Lane
Дата:
Peter Eisentraut <peter_e@gmx.net> writes:
> rand() and RAND_MAX are defined by ANSI C, random() is a BSD-ism. I
> suggest you use the former.

Unfortunately, except on a few platforms like Linux, the typical
rand() implementation is vastly inferior to the typical random()
implementation.  BSD wouldn't have bothered to roll their own if
the older code hadn't been so godawful.  But unless you are using
glibc, you probably have a bug-compatible rand().
        regards, tom lane