【问题标题】:Question Regarding Random Number Generation in Lua关于 Lua 中随机数生成的问题
【发布时间】:2022-01-26 13:56:36
【问题描述】:

我在玩 lua 解释器并制作了这个小程序,它生成两个数字并比较它们。程序运行直到数字匹配。第一个数字是使用 math.random() 随机生成的,设置为 1 和 100000。生成的要比较的第二个值介于 1 和 100 之间。它还跟踪程序循环的次数。该程序按预期运行,但是当我运行它时发生了一些奇怪的事情。

出现的值总是 1、31、62 或 92。我已经多次运行该程序,但它不断生成这些数字。我对如何生成随机数有一些了解,但这似乎很奇怪。我将代码粘贴在下面。如果有人可以解释这里发生了什么,我将不胜感激。谢谢!

counter=0;
a=0;
b=1;
while(a~=b)do
    a=math.random(1,1000000);
    b=math.random(1,100);
    counter=counter+1;
    if(a==b)then
         print(a..", "..b..", and it took "..counter.." times")
    end
end

【问题讨论】:

  • 这是什么版本的 Lua?最新版本会自动为 RNG 播种,因此不会发生这种情况。
  • 它说 lua 5.1 我可以发誓我直接从 lua.org 得到这个。谷歌表示最新版本是 5.4。谢谢你让我知道。有没有什么地方我可以去阅读更多关于导致这种情况的原因的信息?
  • online demo 中运行它。我每次都得到不同的数字。
  • 在 Lua 5.1 上你应该用math.randomseed(os.time())开始你的程序

标签: random lua numbers generate


【解决方案1】:

在 Lua 5.4 中,伪随机数生成器的行为发生了变化。 5.4 Reference Manual§8.2 – Incompatibilities in the Libraries 下表示

函数 math.random 使用的伪随机数生成器现在从一个有点随机的种子开始。此外,它使用了不同的算法。

如果你好奇的话,那个新算法是xoshiro256**

这意味着在 5.4 之前的 Lua 环境中运行的程序必须显式调用 math.randomseed 来为 pRNG 播种。您只想在程序中执行此操作一次

如果不播种 pRNG,每次运行程序时产生的数字序列都是相同的。这是因为,在 5.4 之前,Lua 的 math.random 是使用 C rand 或 POSIX random 实现的,如果没有显式播种,两者都默认使用 1 的种子。

播种 pRNG 的经典方法是使用当前时间 (os.time)。这是一种简单的方法,但缺点是在同一秒内运行该程序两次会得到相同的结果。

local counter = 0
local a = 0
local b = 1

math.randomseed(os.time())

while a ~= b do
    a = math.random(1, 1000000)
    b = math.random(1, 100)
    counter = counter + 1

    if a == b then
        print(a .. ", " .. b .. ", and it took " .. counter .. " times")
    end
end

文档链接,用于比较:

5.3:math.randommath.randomseed
5.4:math.randommath.randomseed

【讨论】:

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