Lua中如何实现Fisher-Yates搅拌算法
2016-2-23 9:50:5
收藏:0
阅读:79
评论:2
我一直在寻求关于随机数的问题,决定使用Fisher-Yates搅拌算法是最佳选择。我创建了一个表't'
t = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
现在,我该如何将它们搅拌并能够单独使用它们,例如在另一个表'u'中生成结果
u = {}
点赞
用户3554391
对于那些后来发现这个答案的人,这将在原地进行洗牌而不制作新表:
local function ShuffleInPlace(t)
for i = #t, 2, -1 do
local j = math.random(i)
t[i], t[j] = t[j], t[i]
end
end
而这一个则返回一个洗牌后的表而不会修改原始表(不像当前答案,它既原地洗牌又返回一个副本):
local function Shuffle(t)
local s = {}
for i = 1, #t do s[i] = t[i] end
for i = #t, 2, -1 do
local j = math.random(i)
s[i], s[j] = s[j], s[i]
end
return s
end
用法:
local t = {"a", "b", "c", "d", "e", "f"}
print(table.concat(t)) --> abcdef
local s = Shuffle(t)
print(table.concat(t)) --> abcdef(未改变)
print(table.concat(s)) --> fbcade(洗牌)
ShuffleInPlace(t)
print(table.concat(t)) --> dcbfea(洗牌)
并快速检查它们是否均匀:
local t = {"a", "b", "c"}
local results = {abc = 0,acb = 0,bac = 0,bca = 0,cab = 0,cba = 0}
for i = 1, 10000000 do
ShuffleInPlace(t)
local r = table.concat(t)
results[r] = results[r] + 1
end
for k, v in pairs(results) do print(k, v) end
--[[
cba 1667473
cab 1666235
bca 1665672
bac 1666782
acb 1666447
abc 1667391
--]]
2021-07-22 14:06:17
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的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中获取用户配置主目录的跨平台方法
注意:请查看另一个答案 https://stackoverflow.com/a/68486276/1190388,它解决了下面代码片段中的问题,并提供了其他替代方案
如果表中没有空洞:
math.randomseed(os.time()) -- 确保结果始终不同 function FYShuffle( tInput ) local tReturn = {} for i = #tInput, 1, -1 do local j = math.random(i) tInput[i], tInput[j] = tInput[j], tInput[i] table.insert(tReturn, tInput[i]) end return tReturn end