Нужно решение для rand_range, обеспечивающее только числа с плавающей точкой, а не целые числа - GDScript - PullRequest
1 голос
/ 06 апреля 2019

Для проекта мне нужно использовать генератор случайных чисел, чтобы обеспечить случайные числа как часть Shuffle Фишера-Йейтса. Я использую оба метода randomize() и randi()%1+50, чтобы получить мои случайные числа.

Однако, выполнение этого способа не позволяет моему shuffler Fisher-Yates считать до n=0, потому что, если это так, он выдает ошибку:

Деление на ноль в операторе%

Указывает прямо на диапазон моего генератора, где находится%. Однако я могу обойти это, используя rand_range(), поскольку rand_range() возвращает число с плавающей точкой, а не целое число, я вынужден округлять результат, что иногда приводит к дублированию чисел, которых у меня не может быть.

ceil() и floor() также не обсуждаются по той же причине. Это, конечно, можно было бы решить, если бы GDScript включал что-то вроде randi_range(), но я видел на других форумах, что это проблема с 2014 года, и до сих пор нет решения.

Q: Учитывая, что это не вариант, кто-нибудь знает способ вернуть случайное число в пределах диапазона, которое не содержит 0 и является положительным целым числом, которое не требует оператор%, чтобы диктовать диапазон?

Не поймите меня неправильно, я люблю движок Godot и ценю его за то, что он есть, но иногда код требует слишком много "борьбы", чтобы справиться с моим умственным здоровьем.

Любая помощь будет принята с благодарностью. Заранее спасибо ...

1 Ответ

1 голос
/ 29 апреля 2019

Годо имеет класс 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 
...