Lua 5.2.1 - 随机数

在 Lua 5.2.1 中,我尝试使用以下代码生成随机数:

num = math.random(9)

然而,每次运行程序:

num = math.random(9)
print("The generated number is "..num..".")

我都得到同样的数字。

brendan@osiris:~$ lua number
The generated number is 8.
brendan@osiris:~$ lua number
The generated number is 8.
brendan@osiris:~$ lua number
The generated number is 8.

这很令人沮丧,因为每当我尝试生成新的数字并重新启动程序时,我都会得到相同的序列。

有没有不同的生成数字的方法?

而且,我查看了以下代码:

math.randomseed(os.time())

但我真的不明白它的含义。如果这确实是解决方案,你能解释一下它是如何工作的,它是干什么的,我会得到什么数字吗?

谢谢,

  • Brendan
点赞
用户107090
用户107090

这不仅仅局限于 Lua。伪随机生成器通常都是这样操作的:它们需要一个_种子_来开始,它们生成的序列并不是真正的随机,实际上在给定种子的情况下是可预测的。这对于调试来说是一件好事,但对于生产来说,您需要以“随机”的方式改变种子。一个简单而典型的做法是在程序开始时使用时间来设置种子_一次_。

2013-09-25 18:07:33
用户502126
用户502126

在 Lua 中,这是预期的输出。无法保证在不同的会话中获得不同的序列。

但是,任何后续调用 math.random 都将生成一个新的数字:

>> lua
> =math.random(9)
1

>> lua
> =math.random(9)
1

>> lua
> =math.random(9)
1
> =math.random(9)
6
> =math.random(9)
2

math.randomseed() 将更改重新播放的序列。例如,如果您设置为 math.randomseed(3),则始终会得到相同的序列,就像上面一样:

>> lua
> math.randomseed(3)
> =math.random(9)
1
> =math.random(9)
2
> =math.random(9)
3

>> lua
> math.randomseed(3)
> =math.random(9)
1
> =math.random(9)
2
> =math.random(9)
3

然而,如果每次运行将 math.randomseed() 设置为唯一值,例如 os.time(),则每次都会获得一个独特的序列。

2013-09-25 18:31:29
用户3150187
用户3150187

首先,你需要调用'math.randomseed()'

'为什么?'

因为Lua生成伪随机数。

--其中一个最好的种子是时间。

所以,你首先要写:

math.randomseed(os.time())

在这之后,

num = math.random(9)
print("生成的数字为 "..num..".")

然而,在Windows上有一个错误。如果你只写'num = math.random(9)',生成的数字将在1个小时内是一样的。

'那我该如何解决这个问题?'

很简单,你需要使用一个for循环。

for n = 0, 5 do
    num = math.random(9)
end

因此,在Windows上,最终代码将是:

math.randomseed(os.time())

for n = 0, 5 do
    num = math.random(9)
end

print("生成的数字为 "..num..".")

注意:如果'for n = 0, 5 do'不能完美地工作,请将5替换为10。

2013-12-31 20:38:19