Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua math.random坏了吗?_Random_Lua - Fatal编程技术网

Lua math.random坏了吗?

Lua math.random坏了吗?,random,lua,Random,Lua,今天我在用lua写一个简单的游戏。游戏的一部分应该从表中选择一个随机元素并打印出来。例如: test = { "foo", "bar", "test"} print(math.random(#test)) 问题是:我这样写的时候总是得1分。 如果我错过了什么,为什么它在REPL中工作 我正在使用Lua5.3.2版 顺便说一句:很抱歉英语不好。您需要为随机数生成器设置种子 Lua的math.random()函数对应于C的rand()函数 在C语言中,rand()函数返回由初始种子确定的序列中的

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

test = { "foo", "bar", "test"}
print(math.random(#test))
问题是:我这样写的时候总是得1分。 如果我错过了什么,为什么它在REPL中工作

我正在使用Lua5.3.2版


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

您需要为随机数生成器设置种子

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,但它们超出了这个问题的范围。)

您需要为随机数生成器设置种子

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,但它们超出了这个问题的范围。)

它在repl中对我不起作用。而且,
#test
只打印索引,而不是值本身。当在几乎所有语言(如果不是所有语言)中使用random()函数时,如果要在每次程序执行时获得不同的结果,必须使用种子值。在调用math.random().ye之前,应该使用类似math.randomseed(os.time())的东西,#test实际返回长度。所以这个数字必须是介于1和#test之间的数字。对吗?对我来说,它在repl中不起作用。而且,
#test
只打印索引,而不是值本身。当在几乎所有语言(如果不是所有语言)中使用random()函数时,如果希望每次程序执行都获得不同的结果,则必须使用种子值。在调用math.random().ye之前,应该使用类似math.randomseed(os.time())的东西,#test实际返回长度。所以这个数字必须是介于1和#test之间的数字。对吗?只有一件事,在BSD和Mac OSX上,存在一个问题,即如果两个种子相差很小,那么random()的结果将是相同的。一个解决方法是math.randomseed(tonumber(tostring(os.time()):reverse():sub(1,6))(source:)只有一件事,在BSD和Mac OSX上,存在一个问题,即如果两个种子的差异很小,那么random()的结果将是相同的。一种解决方法是math.randomseed(tonumber(tostring(os.time()):reverse():sub(1,6))(来源:)