```Newsgroups: comp.security.misc,sci.crypt,alt.security
Path: news.io.com!uunet!europa.chnt.gtegsc.com!cantaloupe.srv.cs.cmu.edu!das-
+     news2.harvard.edu!oitnews.harvard.edu!news.sesqui.net!uuneo.neosoft.com!
+     nmtigw!peter
From: peter@nmti.com (Peter da Silva)

Subject: Re: Random Number Generators
Message-ID:
Sender: peter@nmti.com (peter da silva)
Organization: Network/development platform support, NMTI
References:  <3qfbkc\$pnp@sol.ctr.
+           columbia.edu>
Date: Fri, 2 Jun 1995 21:47:26 GMT
Lines: 45
Xref: news.io.com comp.security.misc:17475 sci.crypt:38136 alt.security:25253

In article , Adam Back  wrote:
> Peter da Silva  writes:
> | Seth Robertson  writes:
> | > Something like: ((double)seed) / ((double)(1<<27)) * 100000000.0

> | But this will still produce a situation where some numbers are more
> | likely than others, since you're still mapping between the same sets of
> | integers.

> Here's a method which I think solves this problem. [...]

> Say we were using rand() producing numbers r,

>       r in [0..2**32)

> And we want to transform this into a random number in the range

>       r' in [0..n)

> Then you could calculate an integer scale factor S:

>       S = int( 2**32 / n )

> ie integer division of 2**32 / n

> And take for use this algorithm to generate random numbers in [0..n)

>   1)  x = rand();
>   2)  x' = int( x / S );
>   3)  if x' > n goto 1)

Or what I usually do:

X = S * n

1) x = rand();
2) if x >= X goto 1
3) x' = int ( x / S )   or  x % n

This moves the division outside the loop.
--
Peter da Silva                                            `-_-'
Network Management Technology Incorporated                 'U`
1601 Industrial Blvd.     Sugar Land, TX  77478  USA
+1 713 274 5180                                "Har du kramat din varg idag?"
```