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())

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

谢谢,

  • 布伦丹
4

3 回答 3

5

这不是 Lua 特有的。伪随机生成器通常是这样工作的:它们需要一个种子来启动,并且它们生成的序列并不是真正随机的,而是在给定种子的情况下实际上是确定性的。这对于调试来说是一件好事,但对于生产来说,您需要以“随机”的方式更改种子。一种简单而典型的方法是在程序开始时使用时间来设置种子。

于 2013-09-25T18:07:33.983 回答
2

在 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-25T18:31:29.743 回答
1

首先,你必须调用'math.randomseed()'

'为什么?'

因为 Lua 会生成伪随机数。

-- 'math.randomseed()' 的最佳种子之一是时间。

所以,你首先要写:

math.randomseed(os.time())

在这之后,

num = math.random(9)
print("The generated number is "..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("The generated number is "..num..".")

OBS:如果 'for n = 0, 5 do' 不能完美运行,则将 5 替换为 10。

于 2013-12-31T20:38:19.223 回答