Lua math.random破了?

时间:2016-12-26 22:36:42

标签: random lua

今天我在lua写了一个简单的游戏。这个游戏的一部分应该从表中选择一个随机元素并打印出来。例如:

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

事情是:在写这样的时候,我总是得到1。 如果我错过了什么,那为什么它在REPL中起作用?

This Screenshot of the code and CMD 我使用lua版本5.3.2。

顺便说一句:抱歉英文不好。

1 个答案:

答案 0 :(得分:3)

您需要为随机数生成器播种。

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()函数通常不是高质量的伪随机数生成器; not 使用的应用程序,如加密,需要不可预测的值。 (有更好的PRNG,但它们超出了这个问题的范围。)