Aléatoire avec graine
Trois colonnes issues de trois générateurs. Les deux qui partagent une graine produisent les mêmes nombres à chaque fois, le troisième non.
L'éditeur ci-dessus fait tourner ce projet. Changez une ligne et il se recharge.
Classes Godot utilisées
RandomNumberGeneratorProgressBar
Le code
scripts/main.gd
extends Node
const ROWS: int = 9
const TICK: float = 0.35
var columns: Array = []
var verdict: Label
var seed_label: Label
var current_seed: int = 20260814
var elapsed: float = 0.0
func _ready() -> void:
var row: HBoxContainer = _root()
columns.append(_column(row, 'rng A', Color('#8da5f3')))
columns.append(_column(row, 'rng B', Color('#8da5f3')))
columns.append(_column(row, 'rng C', Color('#f3d48d')))
_roll()
print('A and B share the seed, C calls randomize, the button rolls a new seed')
func _process(delta: float) -> void:
elapsed += delta
if elapsed < TICK:
return
elapsed = 0.0
_roll_new()
func _roll_new() -> void:
current_seed = randi_range(1000, 999999)
_roll()
func _roll() -> void:
var a: Array = _sequence(current_seed)
var b: Array = _sequence(current_seed)
var c: Array = _sequence(randi())
_paint(columns[0], a, 'seed %d' % current_seed)
_paint(columns[1], b, 'seed %d' % current_seed)
_paint(columns[2], c, 'randomize')
verdict.text = 'A equals B: %s A equals C: %s' % [a == b, a == c]
seed_label.text = 'current seed %d' % current_seed
func _sequence(rng_seed: int) -> Array:
var rng: RandomNumberGenerator = RandomNumberGenerator.new()
rng.seed = rng_seed
var values: Array = []
for i in ROWS:
values.append(rng.randi_range(1, 99))
return values
func _paint(column: Dictionary, values: Array, caption: String) -> void:
column.caption.text = caption
for i in ROWS:
column.values[i].text = '%2d' % values[i]
column.bars[i].value = values[i]
func _column(row: HBoxContainer, heading: String, tint: Color) -> Dictionary:
var box: VBoxContainer = VBoxContainer.new()
box.custom_minimum_size = Vector2(330, 0)
box.add_theme_constant_override('separation', 10)
row.add_child(box)
var title: Label = Label.new()
title.text = heading
title.add_theme_font_size_override('font_size', 24)
title.add_theme_color_override('font_color', tint)
box.add_child(title)
var caption: Label = Label.new()
caption.add_theme_color_override('font_color', Color('#8a90a0'))
box.add_child(caption)
var values: Array = []
var bars: Array = []
for i in ROWS:
var line: HBoxContainer = HBoxContainer.new()
line.add_theme_constant_override('separation', 12)
box.add_child(line)
var value: Label = Label.new()
value.custom_minimum_size = Vector2(34, 0)
value.add_theme_font_size_override('font_size', 18)
line.add_child(value)
var bar: ProgressBar = ProgressBar.new()
bar.max_value = 99
bar.show_percentage = false
bar.custom_minimum_size = Vector2(260, 16)
bar.add_theme_stylebox_override('background', _bar_style(Color('#2a2f3d')))
bar.add_theme_stylebox_override('fill', _bar_style(tint))
line.add_child(bar)
values.append(value)
bars.append(bar)
return {caption = caption, values = values, bars = bars}
func _bar_style(color: Color) -> StyleBoxFlat:
var style: StyleBoxFlat = StyleBoxFlat.new()
style.bg_color = color
style.set_corner_radius_all(5)
return style
func _root() -> HBoxContainer:
var background: ColorRect = ColorRect.new()
background.color = Color('#12141a')
add_child(background)
background.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)
var margin: MarginContainer = MarginContainer.new()
for side in ['margin_left', 'margin_right', 'margin_top', 'margin_bottom']:
margin.add_theme_constant_override(side, 40)
add_child(margin)
margin.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)
var column: VBoxContainer = VBoxContainer.new()
column.add_theme_constant_override('separation', 14)
margin.add_child(column)
var title: Label = Label.new()
title.text = 'Same seed, same numbers'
title.add_theme_font_size_override('font_size', 28)
column.add_child(title)
seed_label = Label.new()
seed_label.add_theme_color_override('font_color', Color('#8a90a0'))
column.add_child(seed_label)
var row: HBoxContainer = HBoxContainer.new()
row.add_theme_constant_override('separation', 24)
column.add_child(row)
var button: Button = Button.new()
button.text = 'roll a new seed'
button.pressed.connect(_roll_new)
column.add_child(button)
verdict = Label.new()
verdict.add_theme_font_size_override('font_size', 20)
verdict.add_theme_color_override('font_color', Color('#8eef97'))
column.add_child(verdict)
return row