2

对于一个项目,我需要使用随机数生成器来提供随机数作为 Fisher-Yates Shuffle 的一部分。我同时使用randomize()randi()%1+50方法来获取我的随机数。

然而,这样做不会让我的 Fisher-Yates 洗牌器倒计时到n=0,因为如果这样做,它会抛出一个错误:

运算符中除以零 %

指向 % 所在的发电机范围。但是,我可以通过使用来解决这个问题rand_range(),因为rand_range()返回的是浮点数而不是整数,我不得不对结果进行四舍五入,这有时会导致重复的数字,这是我无法拥有的。

ceil()并且floor()出于同样的原因也是不可能的。当然,如果GDScript包含类似的东西,这一切都可以解决,randi_range()但我在其他论坛上看到这自 2014 年以来一直是一个问题,并且仍然没有解决方案。

问:鉴于这不是一个选项,有没有人知道一种方法来返回一个范围内的随机数,该范围内不包括 0 并且是一个不需要 % 运算符来指示范围的正整数?

不要误会我的意思,我喜欢 Godot 引擎,并欣赏它的本质,但有时代码需要太多的“摔跤”才能让我的精神健全来处理。

任何帮助将不胜感激。提前致谢...

4

2 回答 2

2

Godot 有一个实现 randi_range()的类RandomNumberGenerator 。

这是一个 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 
于 2019-04-29T07:07:35.683 回答
0
const START = 10
const STOP = 20

var random = RandomNumberGenerator.new()
random.randomize()

var n = random.randi_range(START, STOP)
于 2020-01-12T07:34:30.343 回答