Lua 的 math.random 函数有问题吗?

今天我在写 Lua 简单游戏时,需要从一个表格中选择一个随机元素,并将其打印出来。例如:

test = { "foo", "bar", "test"}
print(math.random(#test))

但问题在于:无论如何,我总是得到1。 如果我错过了什么,那么为什么在 REPL 中它却可以工作呢?

代码和 CMD 的屏幕截图在 REPL 中运行正常 我使用的是 Lua 5.3.2 版本。

顺便说一句:对于我的糟糕英语语言表达,我表示抱歉。

点赞
用户827263
用户827263

你需要为随机数生成器种子赋值。

Lua 的 math.random() 函数对应于 C 的 rand() 函数。

在 C 中,rand() 函数返回由初始种子决定的序列中的下一个值。默认的初始种子值是 1,这意味着程序每次运行时都会使用相同的序列(这在需要可复制的结果时很有用)。

为了获得更接近随机的结果,您需要初始化种子,例如使用当前时间。

在 C 中,可以这样做:

srand(time(NULL));
int r = rand();

相应的 Lua 代码是:

math.randomseed(os.time())
print(math.random())

请注意,os.time() 通常返回当前时间作为整秒数,因此如果您在同一秒内两次运行程序,则会得到相同的种子。此外,C 的 rand() 函数以及 Lua 的 math.rand() 函数通常不是高质量的伪随机数生成器;不要将它们用于需要不可预测值的应用程序,如密码学。(有更好的 PRNG,但它们超出了此问题的范围。)

2016-12-27 00:47:21