2018-09-21 14:32:17 +03:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								<?xml version="1.0" encoding="UTF-8" ?> 
							 
						 
					
						
							
								
									
										
										
										
											2023-07-06 10:08:05 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								<class  name= "RandomNumberGenerator"  inherits= "RefCounted"  xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"  xsi:noNamespaceSchemaLocation= "../class.xsd" > 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-21 14:32:17 +03:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									<brief_description > 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-28 01:35:33 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										Provides methods for generating pseudo-random numbers.
							 
						 
					
						
							
								
									
										
										
										
											2018-09-21 14:32:17 +03:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									</brief_description> 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									<description > 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-21 20:56:25 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										RandomNumberGenerator is a class for generating pseudo-random numbers. It currently uses [url=https://www.pcg-random.org/]PCG32[/url].
							 
						 
					
						
							
								
									
										
										
										
											2023-04-28 01:35:33 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										[b]Note:[/b] The underlying algorithm is an implementation detail and should not be depended upon.
							 
						 
					
						
							
								
									
										
										
										
											2024-01-15 15:23:17 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										To generate a random float number (within a given range) based on a time-dependent seed:
							 
						 
					
						
							
								
									
										
										
										
											2019-06-29 22:59:22 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										[codeblock]
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										var rng = RandomNumberGenerator.new()
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										func _ready():
							 
						 
					
						
							
								
									
										
										
										
											2025-05-17 20:00:17 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											var my_random_number = rng.randf_range(-10.0, 10.0)
							 
						 
					
						
							
								
									
										
										
										
											2019-06-29 22:59:22 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										[/codeblock]
							 
						 
					
						
							
								
									
										
										
										
											2018-09-21 14:32:17 +03:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									</description> 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									<tutorials > 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-15 10:43:07 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										<link  title= "Random number generation" > $DOCS_URL/tutorials/math/random_number_generation.html</link> 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-21 14:32:17 +03:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									</tutorials> 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									<methods > 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-29 13:29:53 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										<method  name= "rand_weighted" > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											<return  type= "int"  /> 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											<param  index= "0"  name= "weights"  type= "PackedFloat32Array"  /> 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											<description > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												Returns a random index with non-uniform weights. Prints an error and returns [code]-1[/code] if the array is empty.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												[codeblocks]
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												[gdscript]
							 
						 
					
						
							
								
									
										
										
										
											2024-03-02 15:34:51 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												var rng = RandomNumberGenerator.new()
							 
						 
					
						
							
								
									
										
										
										
											2024-02-29 13:29:53 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-03-02 15:34:51 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												var my_array = ["one", "two", "three", "four"]
							 
						 
					
						
							
								
									
										
										
										
											2024-02-29 13:29:53 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												var weights = PackedFloat32Array([0.5, 1, 1, 2])
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												# Prints one of the four elements in `my_array`.
							 
						 
					
						
							
								
									
										
										
										
											2024-03-02 15:34:51 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												# It is more likely to print "four", and less likely to print "one".
							 
						 
					
						
							
								
									
										
										
										
											2024-02-29 13:29:53 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												print(my_array[rng.rand_weighted(weights)])
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												[/gdscript]
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												[/codeblocks]
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											</description> 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										</method> 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-13 15:12:25 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										<method  name= "randf" > 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-30 15:28:05 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											<return  type= "float"  /> 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-13 15:12:25 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											<description > 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-02 17:47:17 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												Returns a pseudo-random float between [code]0.0[/code] and [code]1.0[/code] (inclusive).
							 
						 
					
						
							
								
									
										
										
										
											2018-12-13 15:12:25 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											</description> 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										</method> 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-03 17:43:14 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										<method  name= "randf_range" > 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-30 15:28:05 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											<return  type= "float"  /> 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-06 21:11:48 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											<param  index= "0"  name= "from"  type= "float"  /> 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											<param  index= "1"  name= "to"  type= "float"  /> 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-21 14:32:17 +03:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
											<description > 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-11 13:52:19 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												Returns a pseudo-random float between [param from] and [param to] (inclusive).
							 
						 
					
						
							
								
									
										
										
										
											2018-09-21 14:32:17 +03:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
											</description> 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										</method> 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-14 13:53:08 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										<method  name= "randfn" > 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-30 15:28:05 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											<return  type= "float"  /> 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-06 21:11:48 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											<param  index= "0"  name= "mean"  type= "float"  default= "0.0"  /> 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											<param  index= "1"  name= "deviation"  type= "float"  default= "1.0"  /> 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-14 13:53:08 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											<description > 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-01 00:59:28 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												Returns a [url=https://en.wikipedia.org/wiki/Normal_distribution]normally-distributed[/url], pseudo-random floating-point number from the specified [param mean] and a standard [param deviation]. This is also known as a Gaussian distribution.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												[b]Note:[/b] This method uses the [url=https://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform]Box-Muller transform[/url] algorithm.
							 
						 
					
						
							
								
									
										
										
										
											2019-03-14 13:53:08 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											</description> 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										</method> 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-13 15:12:25 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										<method  name= "randi" > 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-30 15:28:05 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											<return  type= "int"  /> 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-13 15:12:25 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											<description > 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-02 17:47:17 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												Returns a pseudo-random 32-bit unsigned integer between [code]0[/code] and [code]4294967295[/code] (inclusive).
							 
						 
					
						
							
								
									
										
										
										
											2018-12-13 15:12:25 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											</description> 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										</method> 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-03 17:43:14 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										<method  name= "randi_range" > 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-30 15:28:05 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											<return  type= "int"  /> 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-06 21:11:48 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											<param  index= "0"  name= "from"  type= "int"  /> 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											<param  index= "1"  name= "to"  type= "int"  /> 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-03 17:43:14 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											<description > 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-11 13:52:19 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												Returns a pseudo-random 32-bit signed integer between [param from] and [param to] (inclusive).
							 
						 
					
						
							
								
									
										
										
										
											2018-12-03 17:43:14 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											</description> 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										</method> 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-21 14:32:17 +03:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
										<method  name= "randomize" > 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-30 15:28:05 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											<return  type= "void"  /> 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-21 14:32:17 +03:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
											<description > 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-01 21:37:01 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												Sets up a time-based seed for this [RandomNumberGenerator] instance. Unlike the [@GlobalScope] random number generation functions, different [RandomNumberGenerator] instances can use different seeds.
							 
						 
					
						
							
								
									
										
										
										
											2018-09-21 14:32:17 +03:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
											</description> 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										</method> 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									</methods> 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									<members > 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-05 00:41:18 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										<member  name= "seed"  type= "int"  setter= "set_seed"  getter= "get_seed"  default= "0" > 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-05 22:48:26 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											Initializes the random number generator state based on the given seed value. A given seed will give a reproducible sequence of pseudo-random numbers.
							 
						 
					
						
							
								
									
										
										
										
											2019-04-02 17:38:03 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											[b]Note:[/b] The RNG does not have an avalanche effect, and can output similar random streams given similar seeds. Consider using a hash function to improve your seed quality if they're sourced externally.
							 
						 
					
						
							
								
									
										
										
										
											2020-12-05 22:48:26 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											[b]Note:[/b] Setting this property produces a side effect of changing the internal [member state], so make sure to initialize the seed [i]before[/i] modifying the [member state]:
							 
						 
					
						
							
								
									
										
										
										
											2023-04-28 01:35:33 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											[b]Note:[/b] The default value of this property is pseudo-random, and changes when calling [method randomize]. The [code]0[/code] value documented here is a placeholder, and not the actual default seed.
							 
						 
					
						
							
								
									
										
										
										
											2020-12-05 22:48:26 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											[codeblock]
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											var rng = RandomNumberGenerator.new()
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											rng.seed = hash("Godot")
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											rng.state = 100 # Restore to some previously saved state.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											[/codeblock]
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										</member> 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										<member  name= "state"  type= "int"  setter= "set_state"  getter= "get_state"  default= "0" > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											The current state of the random number generator. Save and restore this property to restore the generator to a previous state:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											[codeblock]
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											var rng = RandomNumberGenerator.new()
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											print(rng.randf())
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											var saved_state = rng.state # Store current state.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											print(rng.randf()) # Advance internal state.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											rng.state = saved_state # Restore the state.
							 
						 
					
						
							
								
									
										
										
										
											2024-11-13 14:07:40 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											print(rng.randf()) # Prints the same value as previously.
							 
						 
					
						
							
								
									
										
										
										
											2020-12-05 22:48:26 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											[/codeblock]
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											[b]Note:[/b] Do not set state to arbitrary values, since the random number generator requires the state to have certain qualities to behave properly. It should only be set to values that came from the state property itself. To initialize the random number generator with arbitrary input, use [member seed] instead.
							 
						 
					
						
							
								
									
										
										
										
											2025-04-15 12:14:38 +04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											[b]Note:[/b] The default value of this property is pseudo-random, and changes when calling [method randomize]. The [code]0[/code] value documented here is a placeholder, and not the actual default state.
							 
						 
					
						
							
								
									
										
										
										
											2018-09-21 14:32:17 +03:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
										</member> 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									</members> 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								</class>