【LuatOS】Lua与LuatOS中的Math.randomseed
0x00 缘起
在Lua或者LuatOS虚拟机中,可以使用math.randomseed()
进行置随机数种子,然后使用math.random()
生成随机数。那么存在以下操作:
math.randomseed(5)
.- 使用
math.random()
生成 n n n个随机数,组成序列 S 1 S_1 S1. - 再次
math.randomseed(5)
. - 使用
math.random()
生成 n n n个随机数,组成序列 S 2 S_2 S2. - 比较 S 1 S_1 S1 是否等于 S 2 S_2 S2.
上述操作主要测试使用相同的随机数种子进行math.randomseed()
后,是否能够重置随机序列的生成。
0x01 环境
- 操作系统:Windows 11 24H2;
- 硬件参数:
- CPU:Intel i7 9750H;
- RAM: 32GB 2666Mhz;
- 本地Lua环境: Lua 5.1.5;
- 本地LuatOSPC模拟器:
- LuatOS@PC base 24.10 bsp V1109 64bit;
- Lua 5.3.6;
- 在线Lua环境:
- Lua 5.3;
- https://www.jyshare.com/compile/66/;
- 在线LuatOS环境:
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 资源
0x05 后记
- 己欲立而立人,己欲达而达人。