Dans cet article nous allons voir comment générer des nombres aléatoires avec GDScript.

Même si sur le fond la génération de nombres aléatoire avec GDScript est relativement identique au random dans Python, sur la forme elle est assez différente.

D’abord, bien entendu, pas besoins d’importer de module puisque GDScript intègre nativement des fonctions et méthodes dédié au random.

Seed interne.

Godot à la particularité d’avoir un seed interne qui va driver la génération aléatoire de toutes les fonctions liées au random.

Il faut donc avoir conscience que tant que ce seed interne reste le même, toutes les fonctions de génération aléatoire pourraient sembler ne pas générer des nombres aléatoire puisque leur seed reste constant.

Pour avoir de la « vrai » génération aléatoire, il faut donc demander à Godot de changer aléatoirement son seed interne, notamment avec la fonction randomize().

Fonctions random de GDScript

Les fonctions random de GDScript sont :

  • rand_range(from, to) qui retourne un nombre aléatoire de type float compris dans une plage indiqué en argument. Sa plage est inclusive.
  • randi() qui retourne un nombre entier aléatoire. Il est possible de lui spécifier une plage (voir exemple plus bas).
  • randf() qui retourne un nombre décimal aléatoire compris entre 0 et 1
  • rand_see(seed, int) génère une liste de nombre aléatoire dépendant d’un seed. En récupérant et en stockant le seed, on peut reproduire à l’identique cette liste de nombres.
  • randomize() qui permet de générer un seed interne aléatoire. Cette fonction s’utilise principalement dans la fonction _ready() pour changer le seed interne à chaque initialisation d’une classe afin d’obtenir des schémas aléatoire différents.

Et également, une méthode de liste au combien utile, la méthode .shuffle() qui mélange les valeurs d’une liste.

Utilisation de la fonction rand_range()

Cette fonction est très similaire à la fonction random.randrange() du module Python random.

Cette fonction attend une plage en argument et elle renvoi un float aléatoire en retour. Les nombres renseignés en argument sont inclusif, c’est a dire que si l’on demande une plage de 0 à 10, il se peut que le nombre généré aléatoirement soit effectivement 0 ou 10.

Exemple :

func generate_random():
	for i in 5 :
		var my_rand = rand_range(0, 3)
		print(my_rand)

>>> 1.863674
>>> 2.268032
>>> 1.222836
>>> 0.940733
>>> 0.215242

Utilisation de la fonction randi()

Sans argument, cette fonction renvoi un nombre entier aléatoire compris entre 0 et 2^32.

func generate_random():
	for i in 5 :
		var my_rand = randi()
		print(my_rand)
>>> 3161026589
>>> 2668139190
>>> 4134715227
>>> 4204663500
>>> 1099556929

Toutefois, il est possible de lui spécifier une plage exclusive via une étrange syntaxe :

randi() % 20 # Returns random integer between 0 and 19
randi() % 100 # Returns random integer between 0 and 99
randi() % 100 + 1 # Returns random integer between 1 and 100

Documentation de Godot

Utilisation de la fonction randf()

Identique à la fonction de base random.random() du module random de Python. Cette fonction renvoi un float compris entre 0 & 1 :

func generate_random():
	for i in 5 :
		var my_rand = randf()
		print(my_rand)

>>> 0.735984
>>> 0.621225
>>> 0.962688
>>> 0.978975
>>> 0.256011

Utilisation de la fonction rand_seed()

Cette fonction, un peu étrange, renvoi une liste de deux nombres entier aléatoire via un seed qu’on lui passe en argument.

func generate_random():
	var lenght
	for i in 5 :
		var my_rand = rand_seed(25)
		lenght = my_rand.size()
		print(my_rand)
	print(lenght)
>>> [-60513371, 3198867164247606519]
>>> [-60513371, 3198867164247606519]
>>> [-60513371, 3198867164247606519]
>>> [-60513371, 3198867164247606519]
>>> [-60513371, 3198867164247606519]
>>> 2

On peut se servir de cette fonction par exemple dans le cas de génération de monde aléatoire. Le fait de pouvoir récupérer un même liste de nombre aléatoire permet de pouvoir régénérer un monde identique en fournissant le même seed à la fonction.

Utilisation de randomize() pour changer le seed interne

Cette fonction n’agit que sur le seed interne de Godot et permet ainsi que générer des nombres aléatoire différent à chaque itération du moteur.

La fonction randomize() peut s’utiliser dans la fonction _ready().

Exemple, si je lance deux fois :

extends Node2D

func _ready():
	generate_random()
	
func generate_random():
	for i in 5 :
		var my_rand = randf()
		print(my_rand)

J’obtiens deux fois les mêmes nombres :

>>> 0.246699
>>> 0.476715
>>> 0.067642
>>> 0.100719
>>> 0.967545

>>> 0.246699
>>> 0.476715
>>> 0.067642
>>> 0.100719
>>> 0.967545

Maintenant si j’ajoute randomize() dans la fonction _ready() :

extends Node2D

func _ready():
	randomize()
	generate_random()
	random_list()
	
func generate_random():
	for i in 5 :
		var my_rand = randf()
		print(my_rand)

J’obtiens :

>>> 0.571451
>>> 0.088167
>>> 0.381147
>>> 0.655894
>>> 0.643915

>>> 0.145357
>>> 0.034255
>>> 0.22698
>>> 0.411628
>>> 0.254214

Utilisation de la méthode de liste .shuffle()

Relativement similaire à la méthode .shuffle() du module random de Python, cette méthode « mélange » les valeurs dans une liste.

Attention, contrairement au Python, cette méthode modifie directement la liste d’origine !

Exemple :

func random_list():
	var my_list = [0,1,2,3,4,5]
	my_list.shuffle()
	print(my_list)
	pass

>>> [4, 2, 5, 1, 3, 0]

0 commentaire

Laisser un commentaire