meta table 的随机数生成问题

Random number generation problem with meta table

请看下一段代码,Lua。

randomNumber = {
  new = function(self,o)
  o = o or {}
  setmetatable(o, self)
  self.__index = self
  return o
  end,

  math.randomseed(os.time()),
  
  getNum = math.random()
}

for i = 1, 10 do
  x = randomNumber:new()
  print(x.getNum)
end

输出结果如下

0.13782639400248
0.13782639400248
0.13782639400248
0.13782639400248
0.13782639400248
0.13782639400248
0.13782639400248
0.13782639400248
0.13782639400248
0.13782639400248

我想得到 10 个不同的号码。有人能帮我吗?提前谢谢你。

让我们看看你的table构造函数

randomNumber = {
  new = function(self,o)  -- this assigns a function to randomNumber["new"]
  o = o or {}             -- that will return a new instance of your class
  setmetatable(o, self)
  self.__index = self
  return o
  end,

  math.randomseed(os.time()), -- this assigns the first of two random seed components
                              -- returned by math.randomseed to randomNumber[1]
  
  getNum = math.random()    -- this assings a random number [0,1) to randomNumber["getNum"]
}

循环中

for i = 1, 10 do
  x = randomNumber:new()
  print(x.getNum)
end

您创建了一个名为 x 的新实例 randomNumber 10 次。 然后你打印 x.getNum.

x.getNum 是一个 nil 值,因此 Lua 将检查 x 是否有带有 __index 字段的元 table。 __index 引用 randomNumber 所以 Lua 将打印 randomNumber.getNum 这是随机数 [0,1) 自我们构造 randomNumber 以来没有改变。

每次想要一个新的随机数都需要调用math.random

如果您希望 randomNumber 的每个实例都用随机数构造,您需要在 new 函数中分配 o.rn = math.random() 并通过 x.rn 访问它稍后或将函数 getNum 添加到 randomNumber.

getNum = function (self) return self.rn end`

所以你可以print(x:getNum())

我不确定这是否不仅仅是元tables 的练习。但是拥有一个只包含一个数字的专用 class 对我来说意义不大。只需使用一个数值。

您的代码的主要问题很简单...

在非常快的 Lua 循环中 os.time() 不够快,无法设置好的随机种子。

你必须使用更快的东西,比如...

-- Lua 5.3 - 5.4
for i = 1, 10 do
 math.randomseed(math.random(math.mininteger, math.maxinteger)) -- Set seed before print()
 print('Seed: ' .. math.randomseed(math.random(math.mininteger, math.maxinteger)), '\nRandom: ' .. math.random(math.maxinteger)) -- Set seed in print()
 math.randomseed(math.random(math.mininteger, math.maxinteger)) -- Set seed after print()
end

输出类似...

Seed: -634325252416746990   
Random: 5554602367968798340
Seed: 574322306421972413    
Random: 3317370212892010822
Seed: -5465512503977683870  
Random: 6616070635043877067
Seed: -2566820481734265082  
Random: 2581377472505137533
Seed: -8408106760854456996  
Random: 708876515734960246
Seed: 5641371185711405705   
Random: 4259990225803106481
Seed: -3172432877848732304  
Random: 5472223279668970440
Seed: 5842301042132325387   
Random: 6912957407189525897
Seed: 2126448976574029213   
Random: 6156943198274398962
Seed: 4832369017575479065   
Random: 6054703131408226582

Lua 5.1

-- Lua 5.1
math.randomseed(math.random(os.time()))

for i = 1, 10 do
 math.randomseed(math.random(-99999999, 999999999)) -- Set seed before print()
 print('Random: ' .. tostring(math.random(-999999999, 999999999)))                       
 math.randomseed(math.random(-999999999, 999999999)) -- Set seed after print()
end