Faster uniform() in [0.0 - 1.0(
Fawzi Mohamed
fawzi at gmx.ch
Tue Nov 23 05:04:38 PST 2010
On 23-nov-10, at 13:12, tn wrote:
> Fawzi Mohamed Wrote:
>
>>
>> On 23-nov-10, at 10:20, tn wrote:
>>
>>> bearophile Wrote:
>>>
>>>> Don:
>>>>
>>>>> Since the probability of actually generating a
>>>>> zero is 1e-4000, it shouldn't affect the speed at all <g>.
>>>>
>>>> If bits in double have the same probability then I think there is a
>>>> much higher probability to hit a zero, about 1 in 2^^63, and I'm
>>>> not counting NaNs (but it's low enough to not change the substance
>>>> of what you have said).
>>>
>>> For uniform distribution different bit combinations should have
>>> different probabilities because floating point numbers have more
>>> representable values close to zero. So for doubles the probability
>>> should be about 1e-300 and for reals about 1e-4900.
>>>
>>> But because uniform by default seems to use a 32 bit integer random
>>> number generator, the probability is actually 2^^-32. And that is
>>> actually verified: I generated 10 * 2^^32 samples of
>>> uniform!"[]"(0.0, 1.0) and got 16 zeros which is close enough to
>>> expected 10.
>>>
>>> Of course 2^^-32 is still small enough to have no performance
>>> penalty in practise.
>>>
>>> -- tn
>>
>> that is the reason I used a better generation algorithm in blip (and
>> tango) that guarantees the correct distribution, at the cost of being
>> slightly more costly, but then the basic generator is cheaper, and if
>> one needs maximum speed one can even use a cheaper source (from the
>> CMWC family) that still seems to pass all statistical tests.
>
> Similar method would probably be nice also in phobos if the speed is
> almost the same.
Yes, I was thinking of porting my code to D2, but if someone else
wants to do it...
please note that for double the speed will *not* be the same, because
it always tries to guarantee that all bits of the mantissa are random,
and with 52 or 63 bits this cannot be done with a single 32 bit random
number.
>> The way I use to generate uniform numbers was shown to be better (and
>> detectably so) in the case of floats, when looking at the tails of
>> normal and other distributions generated from uniform numbers.
>> This is very relevant in some cases (for example is you are
>> interested
>> in the probability of catastrophic events).
>>
>> Fawzi
>
> Just using 64 bit integers as source would be enough for almost(?)
> all cases. At the current speed it would take thousands of years for
> one modern computer to generate so much random numbers that better
> resolution was justifiable. (And if one wants to measure probability
> of rare enough events, one should use more advanced methods like
> importance sampling.)
I thought about directly having 64 bit as source, but the generators I
know were written to generate 32 bit at a time.
Probably one could modify CMWC to work natively with 64 bit, but it
should be done carefully.
So I simply decided to stick to 32 bit and generate two of them when
needed.
Note that my default sources are faster than Twister (the one that is
used in phobos), I especially like CMWC (but the default combines it
with Kiss for extra safety).
> -- tn
More information about the Digitalmars-d
mailing list