gpt4 book ai didi

sorting - Lua - 对表进行排序并随机化关系

转载 作者:行者123 更新时间:2023-12-02 14:40:21 25 4
gpt4 key购买 nike

我有一个包含两个值的表,一个是名称(字符串且唯一),另一个是数字值(在本例中红心)。我想要的是这样的:按红心对表格进行排序,但当出现平局时随机打乱项目(例如红心相等)。通过标准排序功能,在平局的情况下,顺序始终相同,并且我需要每次排序功能工作时顺序都不同。这是一个例子:

tbl = {{name = "a", hearts = 5}, {name = "b", hearts = 2}, {name = "c", hearts = 6}, {name = "d", hearts = 2}, {name = "e", hearts = 2}, {name = "f", hearts = 7}}
sort1 = function (a, b) return a.hearts > b.hearts end
sort2 = function (a, b)
if a.hearts ~= b.hearts then return a.hearts > b.hearts
else return a.name > b.name end
end

table.sort(tbl, sort2)

local s = ""
for i = 1, #tbl do
s = s .. tbl[i].name .. "(" .. tbl[i].hearts .. ") "
end
print(s)

现在,使用函数 sort2 我想我完全解决了问题。问题是,当 a.hearts == b.hearts 时会发生什么?在我的代码中,它只是按领带的名字排序,而不是我想要的。我有两个想法:

  1. 首先随机打乱表格中的所有项目,然后应用 sort1
  2. 为表中的每个元素添加一个值,称为rnd,这是一个随机数。然后在 sort2 中,当 a.hearts == b.hearts 时,按 a.rnd > b.rnd 对项目进行排序。
  3. sort2中,当a.hearts == b.hearts时随机生成true或false并返回。它不起作用,我知道发生这种情况是因为随机的真/假使订单函数崩溃,因为可能存在不一致。

我不喜欢 1(因为我想在排序函数中完成所有操作)和 2(因为它需要添加一个值),我想做一些类似 3 的事情,但可以工作。问题是:有没有一种简单的方法可以做到这一点,以及实现这一点的最佳方法是什么? (也许方法 1 或 2 是最佳的,但我不明白)。

额外问题。此外,我需要修复一个项目并对其他项目进行排序。例如,假设我们希望 "c" 成为第一个。单独制作一个表格,只包含要排序的项目,对表格进行排序,然后添加固定项目,这样好吗?

最佳答案

-- example table
local tbl = {
{ name = "a", hearts = 5 },
{ name = "b", hearts = 2 },
{ name = "c", hearts = 6 },
{ name = "d", hearts = 2 },
{ name = "e", hearts = 2 },
{ name = "f", hearts = 7 },
}

-- avoid same results on subsequent requests
math.randomseed( os.time() )

---
-- Randomly sort a table
--
-- @param tbl Table to be sorted
-- @param corrections Table with your corrections
--
function rnd_sort( tbl, corrections )
local rnd = corrections or {}
table.sort( tbl,
function ( a, b)
rnd[a.name] = rnd[a.name] or math.random()
rnd[b.name] = rnd[b.name] or math.random()
return a.hearts + rnd[a.name] > b.hearts + rnd[b.name]
end )
end

---
-- Show the values of our table for debug purposes
--
function show( tbl )
local s = ""
for i = 1, #tbl do
s = s .. tbl[i].name .. "(" .. tbl[i].hearts .. ") "
end
print(s)
end

for i = 1, 10 do
rnd_sort(tbl)
show(tbl)
end

rnd_sort( tbl, {c=1000000} ) -- now "c" will be the first
show(tbl)

关于sorting - Lua - 对表进行排序并随机化关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32069912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com