Igor Schein on Wed, 21 Jun 2000 11:35:00 -0400 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: random() weirdness |
On Wed, Jun 07, 2000 at 11:12:57PM +0200, Bill Allombert wrote: > >>>>>>> Igor wrote: > >? ?random > >random({N=2^31}): random integer between 0 and N-1. > > >? setrand(1);random > >1000288896 > >? setrand(1);random(2^31) > >1559883374 > > >How can that be? Is help lying? > > Not truly. In fact the function return a random integer uniformly > distributed between 0 and N-1. which requires extra work. If N is not > given, it just return a value from the internal 31 bits RNG , which is > faster. > > ? # > timer = 1 (on) > ? for(i=1,100000,random) > time = 690 ms. > ? for(i=1,100000,random(2^31)) > time = 1,630 ms. > > you can simulate random(2^31) with > > gpr()=bitor(bitand(random>>12,(1<<16)-1)<<16,bitand(random>>12,(1<<16)-1))>>1 > > ? setrand(1);gpr() > %67 = 1559883374 > ? setrand(1);random(2^31) > %68 = 1559883374 First of all, how is above better than just using random%2^31? Second, I think the following behavior should be documented, if it's indeed intended: ? for(k=0,7,setrand(1+k*2^28);print(random(2^31))) 1559883374 1559883374 1559883374 1559883374 1559883374 1559883374 1559883374 1559883374 I ran into this after many CPU hours. Of course I would have looked in the code if I had a slight suspicion beforehand :) Thanks Igor