LUA中的随机种子

我正在编写一个随机化数字的代码。我将math.randomseed(os.time())放在一个循环里。代码如下:

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

然后当我运行它多次时,整个输出总是相同的。难道randomseed不应该在重新运行时防止重复吗?

点赞
用户107090
用户107090

在程序的开头 仅需调用一次 math.randomseed。在循环中调用它是没有意义的。

2013-07-22 12:18:11
用户1517394
用户1517394

通常,第一批随机数并非真正随机(但任何情况下都不会是真正的随机数生成器,而是伪随机数生成器)。 首先设置一个随机种子,然后随机生成几次。例如尝试以下代码:

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
2013-07-23 07:12:41