需要 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)