Path: cactus.org!milano!cs.utexas.edu!howland.reston.ans.net!wupost!golf! + mizzou1.missouri.edu!C445585 From: C445585@mizzou1.missouri.edu Newsgroups: sci.crypt Subject: Re: modran(x) Date: Thu, 24 Feb 94 18:59:15 CST Organization: University of Missouri, Columbia Lines: 32 Message-ID: <16F6710B08S86.C445585@mizzou1.missouri.edu> References: <17.11880.864.0N63EC25@almac.co.uk> NNTP-Posting-Host: mizzou1.missouri.edu In article <17.11880.864.0N63EC25@almac.co.uk> keith.willis@almac.co.uk (Keith Willis) writes: > More generally, given the standard system function rand() > which returns numbers in the range 0 to RAND_MAX, what is the > correct method for arriving at numbers in the range 0 to N? > I'm in no sense a math major, and I have always used the above > mod-range method or something similar as being in some way > 'intuitively obvious'. Hmmmm. Suppose you had a random number generator that always put out a uniformly distributed number between 0 and 10. Now, imagine trying to get evenly distributed decimal digits by taking the output of that function modulo 10. You'd get twice as many 0s as any other number, right? If you wanted to use this 0..10 generator to get evenly distributed decimal digits, you'd have to discard 10s when they came up. Similarly, suppose you used a generator that put out uniformly distributed numbers between 0 and 255, and you wanted numbers from 0 to 99. You could get this by discarding any generator outputs greater than 199, and taking the acceptable outputs modulo 100. In general, if you have random numbers ranging from 0 to a-1, and you need numbers from 0..b-1, assuming a > b, you need to throw out all the random numbers greater than or equal to (a div b) * b. > >Keith Willis || Internet:keith.willis@almac.co.uk || NO I'M NOT --John Kelsey, c445585@mizzou1.missouri.edu Disclaimer: I didn't write the FAQ, so I can't tell you if there's any- thing else the writer had in mind....