2013-07-22 117 views
4

我正在研究随机数字的代码。我把math.randomseed(os.time())放在一个循环中。代码如下:随机种子在LUA

for i = 1, 1000 do 
    math.randomseed(os.time()) 
    j = math.random(i, row-one) 
    u[i], u[j] = u[j], u[i] 
    for k = 1, 11 do 
    file:write(input2[u[i]][k], " ") 
    end 
    file:write"\n" 
end 

而当我运行它几次,整个输出总是相同的。随机种子是不是应该在重新运行时防止重复?

+1

'os.time()'第二期间返回的值相同。 –

+0

@EgorSkriptunoff所以当我重新运行代码时,如何让整个结果不同? – Rachelle

+3

不要在一秒内运行相同的代码两次:-) –

回答

12

致电math.randomseed一旦在程序的开始。没有一点在循环中调用它。

2

通常第一个随机值不是真正的随机值(但它永远不会是真正的随机值,它是一个伪随机数发生器)。 首先设置一个随机种子,然后随机生成它几次。 试试这个代码,例如:

math.randomseed(os.time()) 
math.random() math.random() math.random() 
for i = 1, 1000 do 
    j = math.random(i, row-one) 
    u[i], u[j] = u[j], u[i] 
    for k = 1, 11 do 
    file:write(input2[u[i]][k], " ") 
    end 
    file:write"\n" 
end 

但是,你可以从http://lua-users.org/wiki/MathLibraryTutorial试试这个:

-- improving the built-in pseudorandom generator 
do 
    local oldrandom = math.random 
    local randomtable 
    math.random = function() 
     if randomtable == nil then 
     randomtable = {} 
     for i = 1, 97 do 
      randomtable[i] = oldrandom() 
     end 
     end 
     local x = oldrandom() 
     local i = 1 + math.floor(97*x) 
     x, randomtable[i] = randomtable[i], x 
     return x 
    end 
end