# Random Numbers

Godot has a number of Random Number functions. The sequence of numbers that are generated are deterministic so each time you run your game, the same sequence of numbers is generated.

To change the sequence, but still have it be deterministic, you can pass an integer value to the `seed(int value)`

function.

Another way is to use the `rand_seed()`

function. This returns an array containing a 32bit signed integer random number and the next seed value. But there are easier functions to use than this.

For getting different random number sequences on each run, apply the `randomize()`

function.

`float rand_range( float from, float to )`

gives a floating point value between the specified limits.

`randf()`

returns a float between 0 and 1. This may be used to flip between choices e.g.

```
if randf() > 0.5 print("A") else print("B")
```

`randi()`

returns a random unsigned 32-bit integer. To limit the range we may use the remainder from modulo division.

```
randi() % 8 # returns a number between 0 and 7
randi() % 100 # returns a number between 0 and 99
10 + randi() % 21 # returns a number between 10 and 30
```

To more intuitively write the last example we could write `int(round(rand_range(10, 30)))`

.

However, this functionality is built into the `RandomNumberGenerator`

class.

```
var rng = RandomNumberGenerator.new()
print(rng.randi_range(-10, 10))
```

To obtain a random number following a normal distribution:

```
var rng = RandomNumberGenerator.new()
rng.randomize()
print(rng.randfn())
```

## Accessing array keys

The array size may be used as follows: `the_array[randi() % the_array.size()]`

We may use a *shuffle bag* approach where we remove a chosen element from the array to avoid it being picked again. Then, refill the array after it is empty.

Another method is picking based on weighted averages. Here we may assign weight values to an array of the same size as our data array. We add up these values to give a sum. Then get a random value between zero and sum. Then scan the array of weights, adding each one until the value exceeds our random value. Thus, we have the index value to select our random pick from our data array.

```
var data = ["a", "b", "c", "d"]
var weights = [1, 3, 4, 8]
var sum
func _ready():
sum = 0
for n in weights:
sum += n
print(pick())
print(pick())
print(pick())
func pick():
var p = randi() % sum
var w = 0
var idx = 0
for n in weights:
w += n
if w > p:
break
idx += 1
return data[idx]
```

See the docs for more examples.

## More solutions

- Godot Keyboard and Mouse Button Input Programming
- Godot Event Handling
- Signals in Godot
- How to Save and Load Godot Game Data
- Godot Timing Tutorial
- Using Anchor Positioning in Godot
- UI Layout using Containers in Godot
- Shaders in Godot
- Godot State Machine
- Godot Behaviour Tree
- Godot Popups
- Parsing XML Data
- Regular Expressions
- Coroutines and Yield
- GraphNode and GraphEdit Tutorial