I wrote: >In addition, xor_shift is better than builtin rand() and faster and >much smaller than MT. but it's wrong. Sorry all.
I found recently a comparison at http://www001.upp.so-net.ne.jp/isaku/rand.html (in Japanese). Time to generate 10^8 pesudorandom numberson a Core 2 Duo E6600 + VS2005: zsfmt(SSE2) : 156ms SFMT(SSE2) : 156ms zmtrand(SSE2) : 250ms zxor : 265ms zmtrand : 266ms xor128() : 328ms zsfmt : 375ms mt19937ar : 625ms SFMT : 1046ms rand() : 1969ms unsigned long xor128(){ static unsigned long x=123456789,y=362436069,z=521288629,w=88675123; unsigned long t; t=(x^(x<<11));x=y;y=z;z=w; return( w=(w^(w>>19))^(t^(t>>8)) ); } http://www.jstatsoft.org/v08/i14/ This shows SFMT/SSE2 is the fastest and twice faster than xor_shift (at least on that environment). -Hideki Hideki Kato: <[EMAIL PROTECTED]>: >I didn't against you, ?lvaro, rather I just made a caution for >programmers who will use your pseudo code as is. :) > >First, I prefer SFMT (SIMD-oriented Fast Mersenne Twister) rather >than integer pseudo random number generators in practice where the >quality of play-out is important. Modern processors execute floating >operations as fast as interger ones and > picked = mt_rand() * (double) num_candidates; >is the simplest and safe. >http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/index.html >#Converting int to double is, in fact, not so fast that >using double num_candidate through out the code may be faster. > >When using integer pseudo random number generators and keeping exact >uniform distribution, following code can be used (slower twice). >This discards extra random numbers that bias the distribution. >#As ?lvaro wrote, if n << RAND_MAX the bias is very small and may be >ignored. > >unsigned long exactly_uniform_random(unsigned long n) { > unsigned long m, r; > if (n == 0) return 0; > m = RAND_MAX % n; > do { > r = rand(); > } while (r <= m) ; > return r % n; >} > >In addition, xor_shift is better than builtin rand() and faster and >much smaller than MT. #Hiroshi, the author of Aya, uses this. >http://en.wikipedia.org/wiki/Xorshift >http://www.jstatsoft.org/v08/i14/paper > >unsigned long xorshiftrand(void) { > static unsigned long > x=123456789, y=362436069, > z=521288629, w=88675123; > unsigned long t; > t = x ^ (x << 11); > x = y; y = z; z = w; > return w = (w ^ (w >> 19)) ^ (t ^ (t >> 8)); >} > >-Hideki > >?lvaro Begu?: <[EMAIL PROTECTED]>: >>On Tue, May 13, 2008 at 11:57 PM, Hideki Kato <[EMAIL PROTECTED]> wrote: >>> >>> ?lvaro Begu?: <[EMAIL PROTECTED]>: >>> >Ooops! I hit sent before I finished writing the pseudo code. Sorry. >>> > >>> >int pick(Move *empties, int num_empties) { >>> > int num_candidates = num_empties; >>> > int picked; >>> > >>> > while(1) { >>> > picked = rand()%num_candidates; >>> >>> This code introduces few bias unless num_candidates is a power of two, >>> though. >>> #Assuming rand() returns [0 .. power of two). >> >>Oh, please. I should probably just take that as a provocation and >>ignore it, but I am weak. :) >> >>The pseudo-code I posted was meant to illustrate the process by which >>you move an element to the end and then exclude it from the lottery. >>rand()%num_candidates is just a quick way of telling the reader "pick >>a random integer in [0,num_candidates)". >> >>Besides, some people didn't care if a point had probability that was >>twice as large as the rest. In my system, RAND_MAX is 2147483647, >>which means that in the worst case, some points will have a >>probability that is a factor of 5948709/5948708=1.00000016810372941485 >>larger than the rest. Even I can live with that. >> >>Preemptive argument: Now someone will point out that the last few bits >>of rand() may not be very random in some common implementations, so in >>the case where num_candidates is a power of two I may have some >>biases. Please, reread two paragraphs above, or substitute rand() with >>the Mersenne twister. >> >> >>?lvaro. >>_______________________________________________ >>computer-go mailing list >>computer-go@computer-go.org >>http://www.computer-go.org/mailman/listinfo/computer-go/ -- [EMAIL PROTECTED] (Kato) _______________________________________________ computer-go mailing list computer-go@computer-go.org http://www.computer-go.org/mailman/listinfo/computer-go/