From: Charles B. <ch...@uc...> - 2005-05-15 17:22:28
|
i've detected something curiously different between yaws 1.48 and 1.54 when cache_refresh_secs = 0. the following page <html> <erl> out(A) -> L = ["a", "b", "c", "d", "e"], R = lists:nth(random:uniform(length(L)), L), {html, "<p>" ++ f("~s", [R]) ++ "</p>"}. </erl> </html> will correctly randomize output in 1.48. in 1.54, however, it always seems to produce the same result. one can see this in action at http://chas.lib.uchicago.edu:1969/random.yaws (1.48) and http://jump.lib.uchicago.edu:1969/random.yaws (1.54). i've written an analogous erlang function and tested it from the erlang shell with the expected results (randomized output) on the machine running 1.54. is there something obvious i'm missing? (nothing popped out at me on reading http://yaws.hyber.org/internals.yaws.) thanks. |
From: Claes W. <kl...@gm...> - 2005-05-16 09:09:08
|
On 5/15/05, Charles Blair <ch...@uc...> wrote: > i've detected something curiously different between yaws 1.48 and 1.54 > when cache_refresh_secs =3D 0. >=20 > the following page >=20 > <html> > <erl> > out(A) -> > L =3D ["a", "b", "c", "d", "e"], > R =3D lists:nth(random:uniform(length(L)), L), > {html, "<p>" ++ f("~s", [R]) ++ "</p>"}. > </erl> > </html> >=20 > will correctly randomize output in 1.48. in 1.54, however, it always > seems to produce the same result. one can see this in action at This has to do with the process dictionary (again sic!) In 1.54 I erase() everything before the process gets tucked into the pool of erlang processes ready to serve a new socket.=20 This is the right thing to do.=20 Thus in the 1.48 code link above, we see buggy behaviour where=20 random() returns differnet values on differnet calls. The random module is a PRNG which relies on a seed. If the seed is always the same (i.e undef= ined) it should always return the same sequence. So, 1.48 is buggy and 1.54 does the right thing. So, to reiterate. The random module keeps the state (i.e the seed) in the process dict and 1.48 didn't correctly erase that dict between sockets. To verify this, you can add a=20 io:format("DICT: ~p~n", [get()]) statement to your out/1 function to see for yourself. Also, yo use random:uniform without a seed always leads to the same completely predictable stream of (non) random numbers. /klacke |
From: Charles B. <ch...@uc...> - 2005-05-16 23:18:11
|
On Mon, May 16, 2005 at 11:08:48AM +0200, Claes Wikstrom wrote: > Also, yo use random:uniform without a seed always leads to the same > completely predictable stream of (non) random numbers. aha! ("i see said the blind man as he picked up his hammer and saw!" :-)) thanks: using a seed works very nicely indeed. |