Hi, that is an interesting (off-)topic :-) May I ask the very last question?
If % is not good enough for getting random values in a range, then what is? I see a lot of "arc4random() % ..." when grepping the /usr/src on OpenBSD. And my (probably too naive) approach to shuffling 32 cards has been: void shuffle(card deck[]) { unsigned k, n; card tmp; for (k = 0; k < 32; k++) { /* find the new position for the card at k */ n = arc4random() % 32; /* swap the cards at the indices k and n */ tmp = deck[n]; deck[n] = deck[k]; deck[k] = tmp; } } Regards Alex 2005/7/18, Jack Bates <[EMAIL PROTECTED]>: > > I happen to be very familiar with this subject, having developed, analyzed > and qualified two different card-shuffling algorithms for real-money play > in the online card game business. There is a fair bit of literature on > this subject. > > Some tips that I can share without breaking an NDA: > > 1) Do not use current time other than as an _adjunct_ to initial seeding > of a quality PRNG. Under OpenBSD, you can obtain a good initial seed from > /dev/?random, so why bother using time at all? > > 2) Use of a hardware device (HRNG), such as the SG-100 from Protego > (Sweden) or motherboard HRNG is preferred to a PRNG, as its state cannot > be observed in memory. > > 3) Qualify the quality of your random seed if it is coming from an HRNG. > Some of these things have "warm-up time" and will initially produce poor > entropy. > > 4) Do not use the % (modulo) operator to select a card. The residues from > % introduce small amounts of bias, and this is a disqualifying factor for > regulated gaming. > > 5) Knuth's "Art of Computer Programming" has an algorithm for fairly > shuffling cards. Unfortunately it assumes perfect floating-point math, > which a computer cannot really do. The algorithm, however, is worth > studying. > > CHEERS > > -- > Jack Bates > Venice, CA, USA > I play Texas Hold'Em at http://www.fulltiltpoker.com