我有一个带有和弦名称和开始时间的和弦表,在不同的开始时间有许多相同的名称。我需要随机选择一个匹配的和弦名称
chord_name = "Cm7b5"
time = chords[chord_name].Start
因此,如果您需要从chord
中选择一个随机的chords
,以便chords[index].Name == chord_name
和您的索引是一个接一个的,例如:1、2、3、4、5(例如:52、96, 121)您可以:
chord_name = "Cm7b5"
index = math.random(#chords)
while chords[index].Name ~= chord_name do
index = math.random(#chords)
end
time = chords[index].Start
(请注意,我没有选择和弦,而是您的示例显示了.Start
时间。]
但是,如果您有很多数据并且只有少数几个具有.Name == chord_name
,则这极有可能(几乎)无限循环。
因此,确保对math.random()
的单次调用将给我们确定的答案(索引),是一个好主意。
chord_name = "Cm7b5"
--we create an empty table
indexes = {}
--and store all indexes that fulfil the condition chords[index].Name == chord_name
for index, chord in pairs(chords) do
if chord.Name == chord_name then
table.insert(indexes, index)
end
end
--now we can randomly select from this table
index = indexes[math.random(#indexes)]
--which will always yield an index pointing to a chord with .Name == chord_name
time = chords[index].Start
注意,使用pairs(chords)
还可以从带孔的桌子中选择和弦(即{[1] = "a", [5] = "b", [16] = "c"}
)。
另一方面,如果您有很多数据(可能是数百万或100k),则后一种解决方案可能会出现问题。遍历整个表并选择匹配的名称,然后基于该表创建新表将非常耗时且占用内存。