There's more than one way to do things PerlMonks

### This may be more of a math question

by Fingo (Monk)
 on May 15, 2002 at 21:03 UTC Need Help??

Fingo has asked for the wisdom of the Perl Monks concerning the following question:

This is taken straight from the documentation for srand
Frequently called programs (like CGI scripts) that simply use

time ^ \$\$

for a seed can fall prey to the mathematical property that

a^b == (a+1)^(b+1)

one-third of the time. So don't do that.
I don't quite understand what the author meant, but this does not seem possible. Is this a mistake, or am I misunderstanding what is meant?
Thanks,
Max

Replies are listed 'Best First'.
Re: This may be more of a math question
by Corion (Pope) on May 15, 2002 at 21:18 UTC

Well, it's simply true - we need first to look at the lowest bit of a and b. If they are both zero, then, obviously, a^b == (a^b) + (1^1) == (a+1)^(b+1).This occurs 25% of the time.

The next (interesting) case would be that both lowest bits of a and b are 1, and the second lowest bit of both, a and b, is 0. Then again, a^b == (a+1)^(b+1).

I'm not sure, if this method of counting will arrive at 33% overall, as there are some other possibilities (like a=5, b=6) which I didn't count, but 25% is close enough to 33% to mark this method of generating random numbers as dangerous.

perl -MHTTP::Daemon -MHTTP::Response -MLWP::Simple -e ' ; # The \$d = new HTTP::Daemon and fork and getprint \$d->url and exit;#spider (\$c = \$d->accept())->get_request(); \$c->send_response( new #in the HTTP::Response(200,\$_,\$_,qq(Just another Perl hacker\n))); ' # web
Yeah, you got it. You just needed to take it a little further to prove it.

When the lowest bit for a and b is 0, then the formula is equal, which happens, as you say, 25% (1/4) of the time.

When the lowest bits for a and b are 01, the formula is equal. This happens 1/16 of the time (there are 16 possible combinations of the lowest 2 bits of 2 variables, and only this particular combo will give you a problem).

So let's say the lowest two bits of both variables are 11. If the next bit is 0 (making the lowest bits of each variable 011), then the formula is equal 1/64 of the time (64 combinations of the lowest 3 bits of 2 variables).

The math majors in the audience will look for a pattern and realize that, to figure out the total probability that the equation will be equal, they just need to sum up the series (1 / (4 ** x)), where x goes from 1 to the number of bits in yer integer. A Perl one-liner that shows the convergence of the series to 1/3 is shown below.

perl -e "\$x=0;for \$y (1 .. 25) { \$x+=(1/4**\$y));print \$x.chr(10)}" 0.25 0.3125 0.328125 0.33203125 0.3330078125 0.333251953125 0.33331298828125 0.333328247070313 0.333332061767578 0.333333015441895 0.333333253860474 0.333333313465118 0.33333332836628 0.33333333209157 0.333333333022892 0.333333333255723 0.333333333313931 0.333333333328483 0.333333333332121 0.33333333333303 0.333333333333258 0.333333333333314 0.333333333333329 0.333333333333332 0.333333333333333
Edit: changed from 2 ** (2 * x) to 4 ** x, which seems to me to be a bit clearer.
Re: This may be more of a math question
by buckaduck (Chaplain) on May 16, 2002 at 12:19 UTC
Just in case...

Perhaps you misunderstand the ^ operator? That's the XOR operator, although many people mistakenly assume it's the exponent operator. Exponents are done with the ** operator. See perlop.

Update: Ah, slow typing will be the death of me someday...

Re: This may be more of a math question
by Anonymous Monk on May 16, 2002 at 12:05 UTC
Note also that ^ is XOR in perl, not exponentiation (which would be ** ).

Create A New User
Node Status?
node history
Node Type: perlquestion [id://166848]
Approved by Corion
Front-paged by MeowChow
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (3)
As of 2020-10-27 07:02 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
My favourite web site is:

Results (256 votes). Check out past polls.

Notices?