I dont remember what language it was but you could do random(1,10) or something like that and it would pick a number between 1 to 10, is there a way to do something like this in gdscript?

asked Apr 2, 2016 in Engine

`randi()%10+1` returns an `int` from 1 to 10

`randf()*10.0+1.0` returns a `float` from 1.0 to 10.999999~

`rand_range(1,11)` returns a `float` from 1.0 to 10.999999~

`range(1,11)[randi()%range(1,11).size()]` is a little ugly and less efficient but returns an `int` from 1 to 10 without you having to do the math yourself (aka the 11+1 part) because all you need to do is set the range()

answered Apr 2, 2016 by (858 points)
edited May 5

This answer has an important error. If you want to produce a real number in the interval [x,y[, in general you use:

``````(randf() * (y-x)) + x.
``````

From 1 to 10, you have `randf() * 9 + 1`. This is because `randf()` can be 1 as maximum. In this case, you would obtain 9 + 1 = 10. In the case proposed by this answer, `randf() * 11 + 1`, if by chance `randf()` turns out to be greater than 0.8 you get something greater than 10. So, there is a 20% chance of having a wrong answer.

randi()%11+1 returns an int from 1 to 11

If you someone needs a random int between 1 and 10, use:
randi()%10+1

Please note that randi()%11+1 return a number between 1 and 11 not 10
because randi()%11 can be 10 and adding 1 to it will make it 11. the same thing for randf()

yes indeed, obviously and i don't know how we could go so wrong

Corrected the inaccuracies. The random floats won't return a 1.0, but at most .999999~.

The last method using arrays I left, but would recommend `int(rand_range(1,11))` as an alternative.

yes. `rand_range(float from, float to)`

use `randomize()` before for "true" random numbers

answered Apr 2, 2016 by (423 points)

Okay thanks for the help ^^

I like this answer better because it mentions the randomize function, which without it, chooses the same "random" numbers every time.

Thanks for mentioning randomize. Is there an approach that permits to specify a seed number?

`RandomNumberGenerator` in Godot 3.1 allows to set any seed for each instance, so you could have independent "deterministic" generators in GDScript for different purposes within a game (randomizing different set of independent features).

As of Godot 3:

`randi() % 20` returns an int from 0 to 19

`randi() % 20 + 1` returns an int from 1 to 20

`randf()` returns a float from 0 to 1

Unfortunately, the older style no longer seems to work.

answered Jan 20, 2019 by (54 points)
edited Feb 25

Just a correction on the third line.

`randi() % 20 + 1` won't return an int from 0 to 20.

It'll be an int from 1 to 20. Still very helpful, thanks.

The following code returns a random number, but it is the same number each time the script is executed:

``````var random_value = rand_range(1,10)
``````

The following code gives you different random numbers each time the script is executed:

``````var random_generator = RandomNumberGenerator.new()
random_generator.randomize()
var random_value = random_generator.randf_range(1,10)
``````

https://docs.godotengine.org/en/stable/classes/class_randomnumbergenerator.html

or simply:

``````randomize()
var random_value = rand_range(1,10)
``````
answered May 23 by (105 points)
edited May 23

You don't need to call `randomize()` every time you pick a random number. Just call it once after starting the project.

Oh. You are right. We don't need to call `randomize()` in every script.