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
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
However, this functionality is built into the
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.
- 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
- Coroutines and Yield
- GraphNode and GraphEdit Tutorial