# Random numbers

To generate random numbers the `Math.random()` method can be used, which returns a `double`, greater than or equal to 0.0 and less than 1.0.

The following code returns a random integer between n and m (where n <= randomNumber < m):

 Code section 3.30: A random integer. ``` int randomNumber = n + (int)(Math.random() * ( m - n )); ```

Alternatively, the `java.util.Random` class provides methods for generating random `boolean`s, `byte`s, `float`s, `int`s, `long`s and 'Gaussians' (`double`s from a normal distribution with mean 0.0 and standard deviation 1.0). For example, the following code is equivalent to that above:

 Code section 3.31: A random integer with Gaussian. ``` Random random = new Random(); int randomNumber = n + random.nextInt(m - n); ```

As an example using random numbers, we can make a program that uses a Random object to simulate flipping a coin 20 times:

 Code listing 3.25: CoinFlipper.java ```import java.util.Random; public class CoinFlipper { public static void main(String[] args) { // The number of times to flip the coin final int TIMES_TO_FLIP = 20; int heads = 0; int tails = 0; // Create a Random object Random random = new Random(); for (int i = 0; i < TIMES_TO_FLIP; i++) { // 0 or 1 int result = random.nextInt(2); if (result == 1) { System.out.println("Heads"); heads++; } else { System.out.println("Tails"); tails++; } } System.out.println("There were " + heads + " heads and " + tails + " tails"); } } ```
 Possible output for code listing 3.25 ```Heads Tails Tails Tails Heads Tails Heads Heads Heads Heads Heads Heads Tails Tails Tails Tails Heads Tails Tails Tails There were 9 heads and 11 tails ```

Of course, if you run the program you will probably get different results.

## Truly random numbers

Both `Math.random()` and the `Random` class produce pseudorandom numbers. This is good enough for a lot of applications, but remember that it is not truly random. If you want a more secure random number generator, Java provides the `java.security.SecureRandom` package. What happens with `Math.random()` and the `Random` class is that a 'seed' is chosen from which the pseudorandom numbers are generated. `SecureRandom` increases the security to ensure that the seed which is used by the pseudorandom number generator is non-deterministic — that is, you cannot simply put the machine in the same state to get the same set of results. Once you have created a `SecureRandom` instance, you can use it in the same way as you can the `Random` class.

If you want truly random numbers, you can get a hardware random number generator or use a randomness generation service.

 To do:Add some exercises like the ones in Variables