Try the Math.random() exercises before viewing the solutions.

Practice using `Math.random()`

with AP CS Tutor Brandon Horn.

## Exercise solutions

### Exercise 1

#### Step 1

```
double r = Math.random();
have: 0.0 <= r < 1.0
want: a <= r < b
```

#### Step 2

```
double r = Math.random() * (b - a);
have: 0.0 <= r < b - a
want: a <= r < b
```

#### Step 3

```
double r = Math.random() * (b - a) + a;
have: a <= r < b
want: a <= r < b
```

The high end would be

`(b - a) + a`

which simplifies to

`b`

### Exercise 2

#### Step 1

```
int r = Math.random();
have: 0.0 <= r < 1.0
want: c <= r <= d
```

#### Step 2

```
int r = Math.random() * (d - c + 1);
have: 0.0 <= r < d - c + 1
want: c <= r <= d
```

Don’t worry about memorizing the exact formula here. The intent of this exercise is that you try, check the resulting range, and start over if the range isn’t what you want. This is one of the few situations in computer science where it’s advantageous to take a (reasonable) guess and check that it works.

#### Step 3

```
int r = (int) (Math.random() * (d - c + 1));
have: 0 <= r <= d - c
want: c <= r <= d
```

The high end would be

`<= d - c + 1 - 1`

which simplifies to

`d - c`

#### Step 4

```
int r = (int) (Math.random() * (d - c + 1)) + c;
have: c <= r <= d
want: c <= r <= d
```

The high end would be

`d - c + c`

which simplifies to

`d`

### Exercise 3

#### Step 1

```
int index = Math.random();
have: 0.0 <= index < 1.0
want: 0 <= index <= names.size() - 1
```

We must determine the numeric range for our random index.

#### Step 2

```
int index = Math.random() * names.size();
have: 0.0 <= index < names.size()
want: 0 <= index <= names.size() - 1
```

#### Step 3

```
int index = (int) (Math.random() * names.size());
have: 0.0 <= index <= names.size() - 1
want: 0 <= index <= names.size() - 1
```

#### Step 4

```
int index = (int) (Math.random() * names.size());
System.out.println(names.remove(index));
```

We use our random index to perform the requested operations. These could be performed using a call to `get`

followed by a call to `remove`

. The `remove`

method already returns the element it removes, so the call to `get`

is unnecessary.

### Exercise 4

```
Case I: int sum = (int) (Math.random() * 8) + 1 + (int) (Math.random() * 8) + 1;
Case II: int sum = 2 + (int) (Math.random() * 8) + (int) (Math.random() * 8);
Case III: int sum = ((int) (Math.random() * 8) + 1) * 2;
```

(D) `I`

and `II`

only

Cases `I`

and `II`

are mathematically equivalent to each other. Both generate 2 random numbers in the correct range and add them together.

Case `III`

generates numbers in the same range, but with different probabilities than Cases `I`

and `II`

. In Case `III`

, every number in the range is equally likely. In Cases `I`

and `II`

, some numbers are considerably more likely than others.

Learn more about `Math.random()`

with AP CS Tutor Brandon Horn.