有一些卢阿麻烦的一个修改费舍-耶茨洗牌到位。例如,假设我有一个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 }
这里的代码是来自上下文,包括“上升的边缘”输入,我正在使用的改组。如果你看下面的测试图,你可以看到,是的,它调整了每个部分的位置,但是它改变了每个部分--我想要重复洗牌的模式。
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测试图:

发布于 2022-07-13 03:39:02
LMD,谢谢,您的帮助回答是发现了一个解决方案(首先创建了迭代器之外的“模式”序列)。(我正在计算的第一个值仍然有一些问题。我可能会看到一些不太棒的math.random函数的生物产品,但这是另一个故事)。我是个新手,所以任何建议都很感谢!
-- 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发布于 2022-07-13 14:14:29
下面是我将如何做到这一点,实现一种简单的方法,首先生成一系列交换,然后将其应用于长度n的子列表
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
https://stackoverflow.com/questions/72958316
复制相似问题