Perhaps I should auto init srand() then for Apache::ASP
to make sure that its happening post fork? Something like
if(! DONE FOR CURRENT PID) {
srand();
}
For reproducability within Apache::ASP, all that has to
happen is someone initializing it to srand(something)
in one of their scripts.
This idea though I think would do well to be bundled
into modperl itself. Doug, what do you think?
> PerlChildInitHandler "sub { srand }"
Thanks,
Joshua
Roger Espel Llima wrote:
>
> Ime Smits wrote:
> > It seems that within Apache::ASP (probably mod_perl) the pseudo random
> > number generator (rand) is not reinitialized (srand) when Apache forks a new
> > process, so each child generates the same sequence of numbers using rand. In
> > Apache::ASP 2.03, I can see [...]
> > commented out. It's not the first time I hear that playing around with srand
> > is bad, even perlfunc mentions that. Can anybody explain to me the reason?
> > Shouldn't this srand thing actually be done somewhere in mod_perl?
>
> and G.W.Haywood replied:
> > It's staggeringly difficult to generate a truly random number using a
> > computer. People go to conferences about it. Same problem with White
> > Noise, which was more in my field when I was in that field. It always
> > turns out some shade of pink. No kidding. [...]
> >
> > On the other hand if you don't want all your Apache children to start
> > with the same seed, I think you're probably justified in changing the
> > seed. That's what it's for.
>
> Yes, perl doesn't reset the 'random generator initialized' status on
> fork, which it arguably should:
>
> $ perl -le 'srand; if (fork) { print rand } else { print rand }'
> 0.804962437599897
> 0.804962437599897
>
> The workaround is to call srand explicitly in a ChildInitHandler. Something
> as simple as
> PerlChildInitHandler "sub { srand }"
> should work.
>
> OTOH, the warnings are real: calling srand when not needed, or trying to
> "help" it with explicit initialization values (time.$$ and similar
> hacks) only worsens the quality of your random numbers. Since perl
> implicitly calls srand() at the first rand() call, there is no reason to
> call srand() outside of forks, or when you actually want the sequences
> to repeat. And srand() doesn't need arguments; it's smart enough to
> look for a decent source of randomness on its own (using /dev/urandom or
> /dev/random or similar if it exists).
>
> --
> Roger Espel Llima, [EMAIL PROTECTED]
> http://www.iagora.com/~espel/index.html