Lua 中随机数生成的问题

我在使用 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

原文链接 https://stackoverflow.com/questions/70498233

点赞
stackoverflow用户2505965
stackoverflow用户2505965

Lua 5.4 中的伪随机数生成器的行为已经改变。5.4 参考手册 根据§8.2 – Incompatibilities in the Libraries,指出:

现在 math.random 函数使用一种略微随机的种子来生成伪随机数。此外,它使用了不同的算法。

如果你感到好奇,新算法是 xoshiro256**

这意味着在 Lua 5.4 之前运行的程序必须显式调用 math.randomseed 来初始化伪随机数生成器。你只需要在程序中执行一次。

如果不初始化伪随机数生成器,每次运行程序生成的数字序列都将是相同的。这是因为在 5.4 之前,Lua 的 math.random 是使用 C 的 rand 或 POSIX 的 random 实现的,如果没有显式设置种子,则默认为 1

初始化伪随机数生成器的经典方法是使用当前时间( 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.random math.randomseed

5.4:math.random math.randomseed

2021-12-27 21:21:21