Lua中的伪随机数生成。变量循环问题。
2014-3-31 15:31:29
收藏:0
阅读:180
评论:1
好吧,一定有比我更简单的方法。 我正在尝试使用一种相当常见的公式编写随机数字生成器。
--随机数生成器
local X0 = os.time()
local A1 = 710425941047
local B1 = 813633012810
local M1 = 711719770602
local X1 = (((A1*X0) + B1) % M1)
local X2 = (((A1*X1) + B1) % M1) --然后我基本上把X1的值反馈给它本身。
print(X2)
local X3 = (((A1*X2) + B1) % M1)
print(X3)
local X4 = (((A1*X3) + B1) % M1)
print(X4)
local X5 = (((A1*X4) + B1) % M1)
print(X5)
local X6 = (((A1*X5) + B1) % M1)
print(X6)
local X7 = (((A1*X6) + B1) % M1)
print(X7)
等等等等。 有人知道更快的方法吗? 我希望能够将它放入类似此类的东西中:
for i=1,Number do
local X[loop count]=(((A1*X[Loop count-1])+B1)%M1)
math.randomseed(X[loop count])
local roll=math.random(1,20)
print("You rolled a "..roll)
end
io.read()
,这种类型的字符串。 我正在用它生成一个桌面游戏中的轨道碎片的随机数字。 代码示例:
if trackclass == "S" then
for i=1,S do --先声明S=25
local roll=math.random(1,5)
local SP=math.random(1,3)
local Count=roll
if Count == 1 then
local Track = "直道"
p(Track.." Of SP "..SP)
else
end
if Count == 2 then
local Track = "曲线"
p(Track.." of SP "..SP)
else
end
if Count == 3 then
local Track = "山坡"
p(Track.." of SP "..SP)
else
end
if Count == 4 then
local Track = "水"
p(Track.." of SP "..SP)
else
end
if Count == 5 then
local Track = "跳跃"
p(Track.." of SP "..SP)
else
end
end
结束
不幸的是,当我使用它时,它似乎生成了相当糟糕的随机数字分布,我真的希望它能更好地工作。任何有关完整化变量循环周期的可能帮助都将不胜感激。 即使是每次调用math.random()就将一添加到X[loop count]]中,以便生成的每个数字实际上都是更好的伪随机数字分布。
请原谅我有点东拉西扯。我的头脑并不一定在思考秩序。
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
有人知道更快的方法吗?
表达式中的每个XN始终是先前的X,因此只需重构代码以使用先前的X而不是创建新的X:
local X = os.time() local A1 = 710425941047 local B1 = 813633012810 local M1 = 711719770602 function myrandomseed(val) X = val end function myrandom() X = (A1 * X + B1) % M1 return X end现在您可以随意调用“myrandom”:
for i=1,100 do print(myrandom()) end另一种打包方法,以避免静态范围,将生成随机数生成器作为闭包,这些闭包绑定到其状态变量:
function getrandom(seed) local X = seed or os.time() local A1 = 710425941047 local B1 = 813633012810 local M1 = 711719770602 return function() X = (A1 * X + B1) % M1 return X end end现在你可以调用“getrandom”为给定的种子获取随机数生成器:
local rand = getrandom() for i=1,100 do print(rand()) end如果您每次调用随机数生成器都调用randomseed,那么您根本没有使用Lua的(即C的)随机数生成器。您可以通过查看上面的'myrandomseed'看出这一点。为什么您要首先通过Lua的随机数来渠道您的数字?为什么不直接使用“math.random”并完成这项工作。
只需确保仅一次调用“math.randomseed”而不是每次调用“math.random”,您将会很好。
当您看到大量几乎相同的代码时,应该将其更改。当您看到变量名称如'foo1','foo2'等时,您可能要么命名变量不当,要么应该使用列表。在您的情况下,您有许多支路'Count == 1','Count == 2'等等,而我们可以使用列表。例如,与您的代码执行相同的操作:
local trackTypes = { '直线', '曲线', '山丘', '水面', '跳跃' } for i=1,S do local trackTypeIndex = math.random(1, #trackTypes) local SP = math.random(1, 3) p(trackTypes[trackTypeIndex]..' of SP '..SP) end请注意,只需读取变量名,您就可以猜出“trackTypes”的含义。我不知道'S'和'SP'是什么。它们可能不是好名字。