Aleatorio con semilla
Tres columnas de tres generadores. Los dos que comparten semilla producen los mismos números siempre, el tercero no.
El editor de arriba está ejecutando este proyecto. Cambia una línea y se recarga.
Clases de Godot usadas
RandomNumberGeneratorProgressBar
El código
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