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

Más ejemplos de Datos