Given the same inputs, most computer programs generate the same outputs every time, so they are said to be **deterministic**. Determinism is usually a good thing,
since we expect the same calculation to yield the same result. For some applications, though, we want the computer to be unpredictable. Games are an obvious example, but there are more.

Making a program truly nondeterministic turns out to be not so easy, but there are ways to make it at least seem nondeterministic. One of them is to use algorithms that generate **pseudorandom** numbers. Pseudorandom numbers are not truly random because they are generated by a deterministic computation, but just by looking at the numbers it is all but
impossible to distinguish them from random.

The `random` module provides functions that generate pseudorandom numbers (which I will simply call “random” from here on).

The function `random` returns a random float between 0.0 and 1.0 (including 0.0 but not 1.0). Each time you call `random`, you get the
next number in a long series. To see a sample, run this loop:

import randomfor i in range(10):x = random.random()print x

The function `randint` takes parameters `low` and `high` and returns an integer between `low` and `high` (including both).

>>> random.randint(5, 10)5>>> random.randint(5, 10)9

To choose an element from a sequence at random, you can use `choice`:

>>> t = [1, 2, 3]>>> random.choice(t)2>>> random.choice(t)3

The `random` module also provides functions to generate random values from continuous distributions including Gaussian, exponential, gamma, and a few more.

**Exercise 13.5.***Write a function named*`choose_from_hist`*that takes a histogram as defined in* *Dictionary as a set of counters and returns a random value from the histogram, chosen with probability in
proportion**to frequency. For example, for this histogram:*

>>> t = ['a', 'a', 'b']>>> hist = histogram(t)>>> print hist{'a': 2, 'b': 1}

*your* *function should return* *'*`a`*'* *with probability* *2/3* *and* *'*`b`*'* *with probability* *1/3**.*

- 796 reads