【问题标题】:Random number generation problem with meta table元表的随机数生成问题
【发布时间】:2022-01-20 20:27:46
【问题描述】:

请看下一段代码,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 个不同的数字。有人能帮我吗?提前谢谢你。

【问题讨论】:

  • math.randomseed(os.time()) 应该只出现在脚本的开头。
  • 好的。谢谢你。但结果并没有改变。
  • getNum = math.random() 替换为getNum = math.random,将print(x.getNum) 替换为print(x.getNum())

标签: random lua metatable


【解决方案1】:

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

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 字段的元表。 __index 指的是 randomNumber,所以 Lua 将打印 randomNumber.getNum,这是随机数 [0,1),自从我们构造 randomNumber 以来就没有改变。

每次需要新的随机数时,您都需要致电math.random

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

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

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

我不确定这是否不仅仅是元表的练习。但是拥有一个只包含一个数字的专门课程对我来说没有太大意义。只需使用数字值即可。

【讨论】:

  • 您的回答对我很有帮助。非常感谢~
【解决方案2】:

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

在非常快的 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

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 2016-05-26
    • 2013-06-03
    • 2017-04-10
    • 2014-07-20
    • 2018-10-11
    • 1970-01-01
    • 2014-06-14
    相关资源
    最近更新 更多