37 lines
928 B
GDScript
37 lines
928 B
GDScript
extends Reference
|
|
class_name Random
|
|
|
|
# Generator
|
|
var generator: RandomNumberGenerator = RandomNumberGenerator.new()
|
|
|
|
# Init
|
|
func _init():
|
|
generator.randomize()
|
|
|
|
# Generate from a range (inclusive)
|
|
func pick_from_range(v1: int, v2: int):
|
|
return generator.randi_range(v1, v2)
|
|
|
|
# Generate from an Array
|
|
func pick_from_array(a: Array):
|
|
var idx = generator.randi_range(0, a.size() - 1)
|
|
return a[idx]
|
|
|
|
# Generate from a dictionary of (value, weight)
|
|
func pick_from_distribution(d: Dictionary):
|
|
var keys = d.keys()
|
|
var weight_sum = 0
|
|
for k in keys:
|
|
weight_sum += d[k]
|
|
# pick a number between 0 and the total minus 1
|
|
var val = generator.randi_range(0, weight_sum - 1)
|
|
# Compute the sums until val < current_sum
|
|
var current_sum = 0
|
|
var ret = keys.front()
|
|
for k in keys:
|
|
current_sum += d[k]
|
|
ret = k
|
|
if val < current_sum:
|
|
break
|
|
return ret
|