# [MUD-Dev] [DGN] The psychology of random numbers

Hans-Henrik Staerfeldt hhs at cbs.dtu.dk
Fri Jan 23 10:23:45 New Zealand Daylight Time 2004

```On Wednesday 21 January 2004 02:44, Dave Bacher wrote:

> The C PRNG can be made worse by using modulus to scale results.
> You can only properly scale results with a multiply followed by a
> divide, assuming integer math.  Any other technique, particularly
> modulus, skews the results.  Lets say the maximum number the LCG
> can generate is 32767.  If you modulus that by 100, you'll see
> that 68 through 99 occur less frequently than 0 through 67.  If
> you modulus by 1000, 768 through 999 occur less frequently, and if
> you modulus by 10000, 2868 through 10000 occur less frequently.

This is an interresting and very useful piece of knowledge! Usually,
your standard I wonder though, if use the usual C PRNG are used, how
many rolls do you have to make before you can determine this skew
with any kind of statistical significance, using the usual C PRNG's,
let alone notice this by playing the game?

So i made a little program to test some of this;

#include <stdlib.h>
#include <stdio.h>

#define size 20
#define rolls 100000000

long long int count[size];

int main() {
int i;
int d;
int e=rolls/size;

for (i=0;i<size;i++) count[i]=0;
for (i=0;i<rolls;i++) {
count[rand()%size]++;
}
for (i=0;i<size;i++) {
d=count[i]-e;
printf("%3d: %6d\t%.6f\n",i,d,100.0*d/e);
}
return 0;
}

Results were;

0:  -1966     -0.039320
1:   -719     -0.014380
2:   1900     0.038000
3:   2124     0.042480
4:     46     0.000920
5:   1392     0.027840
6:   3128     0.062560
7:   2637     0.052740
8:   1517     0.030340
9:   -757     -0.015140
10:  -1387     -0.027740
11:  -3359     -0.067180
12:  -1681     -0.033620
13:   2176     0.043520
14:  -1346     -0.026920
15:  -3723     -0.074460
16:   2109     0.042180
17:  -2032     -0.040640
18:  -2328     -0.046560
19:   2269     0.045380

As you can see, by rolling 100 million times on a d20 (well a d20-1,
not important), the modulus count of a given dice varies at most
0.067180% from the expected for the 11. I know, i should do this for
several seeds, but i guess someone can contradict me if my numbers
were just a fluke.

Now, such a small skew can be extremely difficult to detect if you
don't keep an extremely accurate track of all your rolls. I
seriously doubt that any player will yell 'Hey why the f*** don't I
ever roll an 11?'.

The old 'random()' gives comparable results (at most: 10: -4539
-0.090780%) Using 'lrand48()' is also comparable; (at most: 17: 5026
0.100520%)

Anyway, though a few numbers on the table might be
enlightening... :-)

--
--Hans-Henrik Stærfeldt
_______________________________________________
MUD-Dev mailing list
MUD-Dev at kanga.nu
https://www.kanga.nu/lists/listinfo/mud-dev

```