Lua 5.2.1 - 随机数

时间:2013-09-25 17:42:56

标签: random lua numbers

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

但我真的不明白。如果这确实是解决方案,你可以解释它是如何工作的,它做了什么,以及我得到了多少?

THX,

  • 布伦丹

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分: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(),则每次都会获得一个唯一的序列。

答案 2 :(得分: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:如果'对于n = 0,5做'不能完美地工作,那么用10替换5。