【LuatOS】Lua与LuatOS中的Math.randomseed

【LuatOS】Lua与LuatOS中的Math.randomseed

    • [0x00 缘起](#0x00 缘起)
    • [0x01 环境](#0x01 环境)
    • [0x02 实验](#0x02 实验)
      • 测试代码
      • 实验方法
      • 实验结果
        • [1. 本地Lua环境实验结果](#1. 本地Lua环境实验结果)
        • [2. 在线Lua环境实验结果](#2. 在线Lua环境实验结果)
        • [3. 本地LuatOS环境实验结果](#3. 本地LuatOS环境实验结果)
        • [4. 在线LuatOS实验结果](#4. 在线LuatOS实验结果)
      • 实验总结
    • [0x03 结论](#0x03 结论)
    • [0x04 资源](#0x04 资源)
    • [0x05 后记](#0x05 后记)

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 实验

测试代码

lua 复制代码
-- 函数:生成指定数量的随机数
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环境实验结果
bash 复制代码
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环境实验结果
bash 复制代码
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环境实验结果
bash 复制代码
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实验结果
bash 复制代码
[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 后记

  • 己欲立而立人,己欲达而达人。
相关推荐
不喝水的鱼儿1 小时前
【LuatOS】修改LuatOS源码为PC模拟器添加高精度时间戳库timeplus
lua·时间戳·luatos
菠萝地亚狂想曲2 天前
优雅的LUA数据记录方法-serpent序列化+LUA Table
开发语言·junit·lua
我是汉堡请多指教2 天前
lua学习笔记---面向对象
笔记·学习·lua
Flame_Cyclone3 天前
动态库实现lua网络请求GET, POST, 下载文件
lua·lua动态库
硬汉嵌入式3 天前
H7-TOOL的LUA小程序教程第17期:扩展驱动AD7606, ADS1256,MCP3421, 8路继电器和5路DS18B20(2024-11-01)
junit·小程序·lua
qq_312920113 天前
Nginx+Lua脚本+Redis 实现自动封禁访问频率过高IP
redis·nginx·lua
葵续浅笑4 天前
Redis实战-利用Lua解决批量插入防重方案
数据库·redis·lua·幂等·防重
兔子的洋葱圈5 天前
《Redis实战》note-11 使用Lua脚本提升性能
redis·python·lua
异次元的归来6 天前
LuaJIT源码分析(五)词法分析
lua·luajit