random - 需要解决 rand_range 只提供浮点数而不是整数 - GDScript
问题描述
对于一个项目,我需要使用随机数生成器来提供随机数作为 Fisher-Yates Shuffle 的一部分。我同时使用randomize()
和randi()%1+50
方法来获取我的随机数。
然而,这样做不会让我的 Fisher-Yates 洗牌器倒计时到n=0
,因为如果这样做,它会抛出一个错误:
运算符中除以零 %
指向 % 所在的发电机范围。但是,我可以通过使用来解决这个问题rand_range()
,因为rand_range()
返回的是浮点数而不是整数,我不得不对结果进行四舍五入,这有时会导致重复的数字,这是我无法拥有的。
ceil()
并且floor()
出于同样的原因也是不可能的。当然,如果GDScript
包含类似的东西,这一切都可以解决,randi_range()
但我在其他论坛上看到这自 2014 年以来一直是一个问题,并且仍然没有解决方案。
问:鉴于这不是一个选项,有没有人知道一种方法来返回一个范围内的随机数,该范围内不包括 0 并且是一个不需要 % 运算符来指示范围的正整数?
不要误会我的意思,我喜欢 Godot 引擎,并欣赏它的本质,但有时代码需要太多的“摔跤”才能让我的精神健全来处理。
任何帮助将不胜感激。提前致谢...
解决方案
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
推荐阅读
- azure-data-explorer - 在 Azure 数据资源管理器中使用 Kusto 查询汇总动态值
- elasticsearch - 使用 Logstash 解析对象数组
- pandas - 如何迭代地将值插入到df中?
- flask - 在 google appscript 上捕获 Twilio 的拨出呼叫状态
- c++ - 为什么枚举的变量名必须在 C++ 类中的枚举值之后?
- swiftui - @App 存储和 MKCoordinateRegion 函数
- regex - sed:嵌套模式替换
- apache-spark - 使用 SQL 获取 Apache Spark 或 Databricks 中字段最后一个值的正确方法(last 和 last_value 的正确行为)?
- c - clang-format:删除函数声明中 ')' 和 '{' 之间的空格
- java - 无法编译和运行类路径 Java 应用程序