Bootstrap

【LuatOS】Lua与LuatOS中的Math.randomseed

0x00 缘起

在Lua或者LuatOS虚拟机中,可以使用math.randomseed()进行置随机数种子,然后使用math.random()生成随机数。那么存在以下操作:

  1. math.randomseed(5).
  2. 使用math.random()生成 n n n个随机数,组成序列 S 1 S_1 S1.
  3. 再次math.randomseed(5).
  4. 使用math.random()生成 n n n个随机数,组成序列 S 2 S_2 S2.
  5. 比较 S 1 S_1 S1 是否等于 S 2 S_2 S2.

上述操作主要测试使用相同的随机数种子进行math.randomseed()后,是否能够重置随机序列的生成。

0x01 环境

0x02 实验

测试代码

-- 函数:生成指定数量的随机数
print(_VERSION)

local function generate_random_numbers(seed, count)
    math.randomseed(seed)  -- 设置随机种子
    local numbers = {}
    for i = 1, count do
        table.insert(numbers, math.random())  -- 生成随机数并存入表中
    end
    return numbers
end

-- 设置随机种子和生成数量
local seed = 5
local count = 5

-- 生成两个随机数序列
local s1 = generate_random_numbers(seed, count)
local s2 = generate_random_numbers(seed, count)

-- 输出结果
print("s1:", table.concat(s1, ", "))
print("s2:", table.concat(s2, ", "))

-- 比较两个序列是否相等
local equal = true
for i = 1, count do
    if s1[i] ~= s2[i] then
        equal = false
        break
    end
end

-- 输出比较结果
if equal then
    print("s1 equal s2")
else
    print("s1 not equal s2 !")
end

实验方法

在本地Lua环境、在线Lua环境、本地LuatOS环境、在线LuatOS环境中分别执行2次“实验代码”,并分析输出结果。

实验结果

1. 本地Lua环境实验结果
PS D:\Users\admin\Desktop> lua .\main.lua
Lua 5.1
s1:     0.0016479995117038, 0.87566759239479, 0.37400433362835, 0.74614703817866, 0.84414197210608
s2:     0.0016479995117038, 0.87566759239479, 0.37400433362835, 0.74614703817866, 0.84414197210608
s1 equal s2

PS D:\Users\admin\Desktop> lua .\main.lua
Lua 5.1
s1:     0.0016479995117038, 0.87566759239479, 0.37400433362835, 0.74614703817866, 0.84414197210608
s2:     0.0016479995117038, 0.87566759239479, 0.37400433362835, 0.74614703817866, 0.84414197210608
s1 equal s2
PS D:\Users\admin\Desktop>
2. 在线Lua环境实验结果
Lua 5.3
s1:	0.046467764768749, 0.99275522399694, 0.08003044500947, 0.14768879674375, 0.079644672572613
s2:	0.046467764768749, 0.99275522399694, 0.08003044500947, 0.14768879674375, 0.079644672572613
s1 equal s2

Lua 5.3
s1:	0.046467764768749, 0.99275522399694, 0.08003044500947, 0.14768879674375, 0.079644672572613
s2:	0.046467764768749, 0.99275522399694, 0.08003044500947, 0.14768879674375, 0.079644672572613
s1 equal s2
3. 本地LuatOS环境实验结果
PS D:\Users\admin\Desktop> &"D:\LuatOSeMulator\luatos.exe" D:\Users\admin\Desktop\main.lua
[00000000.002]E/uart uart library initial error!
[00000000.002]I/main LuatOS@PC base 24.10 bsp V1109 64bit
[00000000.002]I/main ROM Build: Oct 30 2024 14:11:01
[00000000.003]D/main loadlibs luavm 1048568 16920 16920
[00000000.003]D/main loadlibs sys   251904 131072 65536
[00000000.003]D/fs fopen main.luac rb
[00000000.003]D/fs fopen main.lua rb
[00000000.003]D/fs fopen main.lua rb
Lua 5.3
s1:     0.12750244100000, 0.30233764600000, 0.73547363300000, 0.14608764600000, 0.024383545000000
s2:     0.65908813500000, 0.10214233400000, 0.20410156200000, 0.57086181600000, 0.62246704100000
s1 not equal s2 !
[00000000.004]E/main Lua VM exit!! reboot in 15000ms

PS D:\Users\admin\Desktop> &"D:\LuatOSeMulator\luatos.exe" D:\Users\admin\Desktop\main.lua
[00000000.001]E/uart uart library initial error!
[00000000.002]I/main LuatOS@PC base 24.10 bsp V1109 64bit
[00000000.002]I/main ROM Build: Oct 30 2024 14:11:01
[00000000.002]D/main loadlibs luavm 1048568 16920 16920
[00000000.002]D/main loadlibs sys   251904 131072 65536
[00000000.002]D/fs fopen main.luac rb
[00000000.002]D/fs fopen main.lua rb
[00000000.002]D/fs fopen main.lua rb
Lua 5.3
s1:     0.12750244100000, 0.30233764600000, 0.73547363300000, 0.14608764600000, 0.024383545000000
s2:     0.65908813500000, 0.10214233400000, 0.20410156200000, 0.57086181600000, 0.62246704100000
s1 not equal s2 !
[00000000.003]E/main Lua VM exit!! reboot in 15000ms
PS D:\Users\sen79\Desktop>
4. 在线LuatOS实验结果
[14:12:06] 虚拟机初始化完毕
[14:12:06] Lua 5.3
[14:12:06] s1:	0.25809025764465, 0.89685845375061, 0.32093167304993, 0.81395554542542, 0.12924122810364
[14:12:06] s2:	0.25809025764465, 0.89685845375061, 0.32093167304993, 0.81395554542542, 0.12924122810364
[14:12:06] s1 equal s2
[14:12:06] 虚拟机已停止运行

[14:12:23] 虚拟机初始化完毕
[14:12:23] Lua 5.3
[14:12:23] s1:	0.25809025764465, 0.89685845375061, 0.32093167304993, 0.81395554542542, 0.12924122810364
[14:12:23] s2:	0.25809025764465, 0.89685845375061, 0.32093167304993, 0.81395554542542, 0.12924122810364
[14:12:23] s1 equal s2
[14:12:23] 虚拟机已停止运行

实验总结

统计上述实验结果,形成以下表格:

运行环境S1=S2两次运行结果相同
本地Lua
在线Lua
本地LuatOS
在线LuatOS

除本地LuatOS环境 S 1 ≠ S 2 S1≠S2 S1=S2 外,其余环境均 S 1 = S 2 S1=S2 S1=S2 ,所有运行环境两次运行结果均相同。

0x03 结论

在本地Lua环境、在线Lua环境、本地LuatOS环境、在线LuatOS环境4个Lua运行环境中,执行两次“实验代码”以测试math.randomseed()的表现。实验结果表明,在本地LuatOS环境中math.randomseed()不能够重置math.random()的随机数生成序列,本地Lua环境、在线Lua环境、在线LuatOS环境3个环境中,math.randomseed()均能够重置math.random()的随机数生成序列。

0x04 资源

  1. Lua 5.3 在线环境
  2. LuatOS 在线体验

0x05 后记

  • 己欲立而立人,己欲达而达人。

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;