首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重复循环的Lua洗牌

重复循环的Lua洗牌
EN

Stack Overflow用户
提问于 2022-07-12 20:58:57
回答 2查看 63关注 0票数 0

有一些卢阿麻烦的一个修改费舍-耶茨洗牌到位。例如,假设我有一个16项表(序列)。我想洗牌整数1-4,然后应用表格中的洗牌模式到1-4,5-8,9-12,13-16。所以:

{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }

4项改组模式为4,2,3,1,将成为:

{ 4, 2, 3, 1, 8, 6, 7, 5, 12, 10, 11, 9, 16, 14, 15, 13 }

这里的代码是来自上下文,包括“上升的边缘”输入,我正在使用的改组。如果你看下面的测试图,你可以看到,是的,它调整了每个部分的位置,但是它改变了每个部分--我想要重复洗牌的模式。

代码语言:javascript
复制
t = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}

range = 4

local function ShuffleInPlace(t)
    for i = #t, 2, -1 do
    
    local j = math.random(1, range)     
    local k = (math.floor(i/(range+.001)))*range + j
                
    t[i], t[j] = t[j], t[i]
    end
end

-- initialize new table for shuffling
if s == nil then s = {} end 

-- use gate rising edge to shuffle
if prev == nil then prev = 0 end
if gate > 0 and prev <= 0 then  
    s = t
    ShuffleInPlace(s)
end

prev = gate

测试图:

EN

回答 2

Stack Overflow用户

发布于 2022-07-13 03:39:02

LMD,谢谢,您的帮助回答是发现了一个解决方案(首先创建了迭代器之外的“模式”序列)。(我正在计算的第一个值仍然有一些问题。我可能会看到一些不太棒的math.random函数的生物产品,但这是另一个故事)。我是个新手,所以任何建议都很感谢!

代码语言:javascript
复制
-- range input is 0 to 1
seqRange = math.floor(range*(#t*.99))

local function ShuffleRange(x)
    
    if rdm == nil then rdm = {} end
    for m = 1, x do rdm[m] = m end

    for m = #rdm, 2, -1 do
        local j = math.random(m)
        rdm[m], rdm[j] = rdm[j], rdm[m]
        return rdm[m]
    end
end

local function ShuffleInPlace(t)

    y = ShuffleRange(seqRange)           

    for i = #t, 2, -1 do
        local j =  (math.floor(i/(seqRange*1.001)))*seqRange + y
        t[i], t[j] = t[j], t[i]
    end
end
票数 0
EN

Stack Overflow用户

发布于 2022-07-13 14:14:29

下面是我将如何做到这一点,实现一种简单的方法,首先生成一系列交换,然后将其应用于长度n的子列表

代码语言:javascript
复制
math.randomseed(os.time()) -- seed the random

local t = {}; for i = 1, 16 do t[i] = i end -- build table

local n = 4 -- size of subtables
local swaps = {} -- list of swaps of offsets (0-based)
for i = 0, n - 1 do
    -- Insert swap into list of swaps to carry out
    local j = math.random(i, n - 1)
    table.insert(swaps, {i, j})
end

-- Apply swaps to every subtable from i to i + n
for i = 1, #t, n do
    for _, swap in ipairs(swaps) do
        -- Swap: First add offsets swap[1] & swap[2] respectively
        local a, b = i + swap[1], i + swap[2]
        t[a], t[b] = t[b], t[a]
    end
end

print(table.concat(t, ", "))

输出示例:4, 2, 1, 3, 8, 6, 5, 7, 12, 10, 9, 11, 16, 14, 13, 15

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72958316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档