Hi Christophe,

our mails overlapped :)

> PicoLisp was not the Haynes one, but the one referred as «Newlib» here:
> http://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use

Right. I took it originally from the book by Donald Knuth.

> Maybe I was too tired. The difference is 33, and we see in the Ersatz src:
> n = (int)(Seed >>> 33) % n;


> What I don't understand is why Ersatz shifts by 33, and PicoLisp by BITS,
> (which should IMHO be 32).

True. In fact, as I wrote, I don't remember that either. Perhaps a sign
issue? Would it make sense to change it? Should be well tested though.

This connects to my next remarks/questions:

> * The Wikipedia page mentions taking «bits 63...32». I guess that
>   they start at bit 0, thus should the shift be 32 ?

Knuth writes that the highest bits are more random than the lower bits
in a linear congruential generator.

> * Is 33 used because of the sign bit ?

Yes, perhaps.

> * In the PicoLisp src, why use LL and not ULL to define
> 6364136223846793005?

   : (hex 6364136223846793005)
   -> "5851F42D4C957F2D"

As you see, this number doesn't have its sign bit set in 64-bit
two-complement representation (it would be 8 or higher in its most
siginificant digit). So "unsigned" makes no difference.

♪♫ Alex
UNSUBSCRIBE: mailto:picolisp@software-lab.de?subject=Unsubscribe

Reply via email to