A true random number generator has three important properties:

- It is
**unbiased**.

All values of whatever sample size is collected are equiprobable. - It is
**unpredictable**.

It is impossible to predict what the next output will be, given all the previous outputs, but not the internal “hidden” state. - It is
**unreproducible**.

Two of the same generators, given the same starting conditions, will produce different outputs.

- A “good” random number generator is
**unbiased**. - A “cryptographically strong” random number generator is
**unpredictable**. - A “true” random number generator, is
**unreproducible**.

Very rarely is a random number generator all of: “good”, “cryptographically strong”, and “true”. This isn't necessarily a bad thing, but it's worth remembering when evaluating claims that one random number generator is “better” than another.

`<stdlib.h>`

provides us with two random number generator functions:

`rand()`

`srand()`

`rand()`

- This function generates a number between 0 and
`RAND_MAX`

. `RAND_MAX`

is a symbolic constant, defined in`<stdlib.h>`

- Every number between 0 and
`RAND_MAX`

has an equal chance of being chosen each time`rand()`

is called.

int number = rand(); printf("%d\n", number);

1804289383

Why is the number so big? Shouldn’t we *randomly* get a small number
every once in a while?

`srand()`

- This function is used to produce a truer sequence of random numbers,
which is achieved by seeding
`srand()`

with a different seed every time it is called. - This function is called only once in a particular program.
**Once!** - After that, call
`rand()`

to get random numbers.

- A popular method for seeding is to use the system clock.
`time(NULL)`

returns the number of seconds since the start of 1970.- Really—the year 1970.
- As of Monday 11:55ᴘᴍ, there were 1521525324 seconds
since the start of 1970.

srand(time(NULL)); printf("%d\n", rand());

489363497

- Numbers generated by the random number generators may not necessarily be in the desired range.
- Scaling allows us to restrict the output values to what is needed.

- To use
`rand()`

and`srand()`

to produce values in a particular range, we may generalize:

int number = a + rand() % b;

`a`

is the shifting value (the first number in the desired range of consecutive integers)`b`

is the scaling factor (the width of the desired range of consecutive integers).

- That is, it returns
`b`

different numbers, starting at`a`

. - In other words, it produces b…b+a−1, inclusive.
- Note that b+a is not a possibility.

srand(time(NULL)); for (int row = 0; row < 7; row++) { for (int i = 0; i < 20; i++) printf(" %d", 18 + rand() % 8); printf("\n"); }

19 25 21 20 23 19 25 24 21 23 23 25 24 18 21 24 23 22 23 21 20 24 24 18 22 22 22 24 22 25 22 23 24 25 18 22 18 25 20 22 23 25 21 21 25 25 19 22 21 25 25 23 23 23 23 19 19 19 25 23 18 21 21 25 20 21 21 21 20 23 25 25 22 20 20 21 19 22 25 22 21 24 19 18 21 25 20 22 18 19 20 19 23 23 18 25 18 21 20 20 18 19 20 22 22 22 25 23 18 24 20 21 22 21 22 25 20 24 21 21 25 23 22 22 20 22 22 20 25 24 23 25 18 25 21 22 21 20 19 22

Modified: 2017-12-10T17:22 User: Edit History Source |
Apply to CSU |
Contact CSU |
Disclaimer |
Equal Opportunity Colorado State University, Fort Collins, CO 80523 USA © 2015 Colorado State University |