需要 rand_range 的解决方案,仅提供浮点数而不提供整数 - GDScript
Need solution to rand_range providing only floats and not integers - GDScript
对于一个项目,我需要使用随机数生成器来提供随机数作为 Fisher-Yates Shuffle 的一部分。我同时使用 randomize()
和 randi()%1+50
方法来获取我的随机数。
但是这样做不会让我的 Fisher-Yates 洗牌器倒数到 n=0
,因为如果倒数,它会引发错误:
Division By Zero in operator %
正好指向 % 所在的我的发电机范围。我可以通过使用 rand_range()
来解决这个问题,但是,因为 rand_range()
return 是一个浮点数而不是一个整数,我不得不对结果进行舍入,这有时会导致重复的数字,我不能有。
ceil()
和 floor()
也是同样的原因。当然,如果 GDScript
包含类似 randi_range()
的内容,这一切都可以解决,但我在其他论坛上看到,自 2014 年以来,这一直是一个问题,并且仍然没有解决方案。
问:鉴于这不是一个选项,有没有人知道return一个随机数的方法,在一个范围内,不包括 0 和是不需要 % 运算符指定范围的正整数?
不要误会我的意思,我喜欢 Godot 引擎,并欣赏它的本质,但有时代码需要太多 "wrestling" 我的理智无法处理。
如有任何帮助,我们将不胜感激。
提前致谢...
Godot 有一个 class RandomNumberGenerator 确实实现了 randi_range()。
这是一个 FisherYates Shuffle 来向我自己证明它应该有效:
extends Node2D
var deck = []
func init_deck():
var arr = []
for i in range(1,52):
arr.append(i)
return arr
# Called when the node enters the scene tree for the first time.
func _ready():
deck = init_deck()
var n = len(deck)
print(fy_shuffle(deck, n))
pass # Replace with function body.
#Fisher Yates Shuffle
func fy_shuffle (arr, n):
# Start from the last element and swap one by one.
var rng = RandomNumberGenerator.new()
for i in range(n-1,0,-1):
# Pick a random index from 0 to i
var j = rng.randi_range(0,i+1)
# Swap arr[i] with the element at random index
var t1 = arr[i]
var t2 = arr[j]
arr[i] = t2
arr[j] = t1
return arr
const START = 10
const STOP = 20
var random = RandomNumberGenerator.new()
random.randomize()
var n = random.randi_range(START, STOP)
对于一个项目,我需要使用随机数生成器来提供随机数作为 Fisher-Yates Shuffle 的一部分。我同时使用 randomize()
和 randi()%1+50
方法来获取我的随机数。
但是这样做不会让我的 Fisher-Yates 洗牌器倒数到 n=0
,因为如果倒数,它会引发错误:
Division By Zero in operator %
正好指向 % 所在的我的发电机范围。我可以通过使用 rand_range()
来解决这个问题,但是,因为 rand_range()
return 是一个浮点数而不是一个整数,我不得不对结果进行舍入,这有时会导致重复的数字,我不能有。
ceil()
和 floor()
也是同样的原因。当然,如果 GDScript
包含类似 randi_range()
的内容,这一切都可以解决,但我在其他论坛上看到,自 2014 年以来,这一直是一个问题,并且仍然没有解决方案。
问:鉴于这不是一个选项,有没有人知道return一个随机数的方法,在一个范围内,不包括 0 和是不需要 % 运算符指定范围的正整数?
不要误会我的意思,我喜欢 Godot 引擎,并欣赏它的本质,但有时代码需要太多 "wrestling" 我的理智无法处理。
如有任何帮助,我们将不胜感激。 提前致谢...
Godot 有一个 class RandomNumberGenerator 确实实现了 randi_range()。
这是一个 FisherYates Shuffle 来向我自己证明它应该有效:
extends Node2D
var deck = []
func init_deck():
var arr = []
for i in range(1,52):
arr.append(i)
return arr
# Called when the node enters the scene tree for the first time.
func _ready():
deck = init_deck()
var n = len(deck)
print(fy_shuffle(deck, n))
pass # Replace with function body.
#Fisher Yates Shuffle
func fy_shuffle (arr, n):
# Start from the last element and swap one by one.
var rng = RandomNumberGenerator.new()
for i in range(n-1,0,-1):
# Pick a random index from 0 to i
var j = rng.randi_range(0,i+1)
# Swap arr[i] with the element at random index
var t1 = arr[i]
var t2 = arr[j]
arr[i] = t2
arr[j] = t1
return arr
const START = 10
const STOP = 20
var random = RandomNumberGenerator.new()
random.randomize()
var n = random.randi_range(START, STOP)