Integer Overflow
Ursus Horibilis
ursus_horibilis at hotmail.com
Wed Nov 28 09:34:43 EST 2001
"Gareth McCaughan" <Gareth.McCaughan at pobox.com> wrote in
message news:slrna08439.1ra3.Gareth.McCaughan at g.local...
> "Ursus Horibilis" wrote:
>
> > unsigned int Lcprng(unsigned int *seed)
> > {
> > *seed = 29 * (*seed) + 13;
> > return (*seed);
> > }
> >
> > How do you do this in Python?
>
> Points to note:
>
> - using a 1-element list is about the nearest equivalent
> we have to passing in a pointer as your C code does.
> It's not necessarily good style (but then, neither is
> the pointer-passing thing).
Could you expand on that? It sounds like it has all the
makings of a religious war (;-) Would the following be a
preferred way of doing things:
def Lcprng(state):
"""Pass this a variable containing the seed. Don't forget to
update the seed with the returned value each time this
function is called."""
return int((29L*state+13L) & 0x0FFFFFFFL)
.......Calling Program......
RanNum = 987654321 # Initialize Random Number Seed
............................................
RanNum = Lcprng(RanNum) # Keep updating seed with value
...........................................
>
> - After one iteration, the value in "state" will be a
> long integer and there will therefore be no danger
> of overflow. But you should make sure you start it
> off with a long anyway.
What will happen if I do this:
state[0] = int((29L * state[0] + 13L) & 0x0FFFFFFFFL)
?
>
> By the way, that's not a very good random number generator.
:-)
Yes, you're right. Linear Congruential PRNG's are not very
good, but they are widely used because of their simplicity. I
just whipped an equation off the top of my head that would
generate maximal-period pseudo random numbers. I wasn't
worried much about the quality.
Better is:
state = 179418817 + 179419969 * state
More information about the Python-list
mailing list