Re: Re: [GENERAL] random() function produces wrong range
От | Peter Eisentraut |
---|---|
Тема | Re: Re: [GENERAL] random() function produces wrong range |
Дата | |
Msg-id | Pine.LNX.4.21.0008050002340.1568-100000@localhost.localdomain обсуждение исходный текст |
Ответы |
Re: Re: [GENERAL] random() function produces wrong range
|
Список | pgsql-hackers |
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
В списке pgsql-hackers по дате отправления: