Reference · Godot 4
The class you should reach for whenever a procgen algorithm needs randomness. See official docs.
randi() / randf()Godot exposes global random functions (randi(), randf(), randi_range()) that use a single shared, engine-wide PRNG state. That's fine for one-off effects (particle jitter), but for procgen you want an isolated, seedable stream so one system's randomness doesn't perturb another's, and so you can save/restore exact state. Use an instance of RandomNumberGenerator instead.
var rng := RandomNumberGenerator.new()
rng.seed = 12345 # any int — same seed, same sequence
# rng.randomize() # use instead of a fixed seed for true randomness
var x := rng.randi_range(0, 9) # int in [0, 9]
var f := rng.randf() # float in [0.0, 1.0)
var f2 := rng.randf_range(-1.0, 1.0)
var coin := rng.randi() % 2 == 0 # avoid — use randi_range instead
var rng := RandomNumberGenerator.new()
rng.seed = 12345
generate_dungeon(rng) # pass the SAME rng instance through the whole generator
# Later, to reproduce exactly:
var rng2 := RandomNumberGenerator.new()
rng2.seed = 12345 # same seed →same dungeon, if generation order is unchanged
Array.shuffle() called from a different RNG can silently break reproducibility.
| Call | Returns |
|---|---|
randi() | random 32-bit unsigned int, full range |
randi_range(from, to) | random int, inclusive both ends |
randf() | random float in [0.0, 1.0) |
randf_range(from, to) | random float in [from, to) |
randomize() | reseeds from OS entropy — use for non-reproducible runs |