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
请看下一段代码,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