带种子的随机

三个生成器产生三列数字。共用种子的那两个每次都给出相同结果,第三个不会。

上方的编辑器正在运行这个项目。改一行代码,它就会重新加载。

用到的 Godot 类

RandomNumberGeneratorProgressBar

代码

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

更多数据示例