今天我在lua写了一个简单的游戏。这个游戏的一部分应该从表中选择一个随机元素并打印出来。例如:
test = { "foo", "bar", "test"}
print(math.random(#test))
事情是:在写这样的时候,我总是得到1。 如果我错过了什么,那为什么它在REPL中起作用?
This 我使用lua版本5.3.2。
顺便说一句:抱歉英文不好。
答案 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,但它们超出了这个问题的范围。)