Lua 中从表中选取 N 个等间距元素

我正在尝试编写一个程序,用于从给定的整数数组中等间距地选择 N 个数字

我的尝试是基于此帖子的 Lua 实现: https://stackoverflow.com/a/2451363

我将 local step = (tableLen-1)/(n-1) 更改为 local step = (tableLen-2)/(n-1) 因为 Lua 表从 1 开始(在更改之前也无法工作)。 我得到了奇怪的结果。 例如,当我尝试从数组中选择 3 个数字时,它会在数组的最高成员为 20 时选择 27。 我认为问题可能在于 tableLen-2 或我在 for 循环中开始的索引(0 vs 1)。

这是我的代码

myTable = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}

local tableLen = table.getn(myTable) --20

local n = 3

print("choosing " .. n .. " numbers")

local step = (tableLen-2)/(n-1)

local count = 0

for i=0,n,1 do
    count = count + 1
    local wantedIndex = math.floor((step * i) + 0.5)
    print("wanted index " .. wantedIndex)
    if wantedIndex > tableLen then
        print("out of bounds!")
    end
end

local worked = n == count
print("did it match? " .. tostring(worked) .. " count " .. tostring(count))

这是 n=3 的输出

choosing 3 numbers
wanted index 0
wanted index 9
wanted index 18
wanted index 27
out of bounds!
did it match? false count 4

这是 n=15 的输出

wanted index 0
wanted index 1
wanted index 3
wanted index 4
wanted index 5
wanted index 6
wanted index 8
wanted index 9
wanted index 10
wanted index 12
wanted index 13
wanted index 14
wanted index 15
wanted index 17
wanted index 18
wanted index 19
did it match? false count 16
点赞
用户4984564
用户4984564

看起来你想要这样的东西?

local function evenly(number, items)
    local space = math.floor((#items-1) / (number-1))
    for i=1,#items,space do
        print(items[i])
    end
end

evenly(5, {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20})
2020-11-11 07:55:56
用户3342050
用户3342050

似乎您将步幅和检索项混淆了。如果您希望相同,它们可以是相同的值,但不必如此。

#! /usr/bin/env lua

local myTable = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}

local begin = 5
local items = 4
local step = 3

local text = 'Beginning at index %d, and printing %d items, every %d steps:\n'
print( string.format( text,  begin,  items,  step ) )

for i=begin,  #myTable,  step do
    print( string.format( 'index %2d   value: %2d',  i,  myTable[i] ) )

    items = items -1
    if items == 0 then break end  --  break out of loop once amount of items have been retrieved
end

输出:

Beginning at index 5, and printing 4 items, every 3 steps:

index 5 value: 5

index 8 value: 8

index 11 value: 11

index 14 value: 14


编辑:

如果列表长度可以被n整除,那么只有您才能获得均匀间隔的项目。因此,20个元素:1, 2, 4, 5, 10, 20。更小的步长将不得不退出循环,否则它们可能会比预期多一个,因为math.floor()会丢弃会导致最后一个完整数字的小数部分。

#! /usr/bin/env lua

local myTable = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}

local n = 6

for i=1,  #myTable,  math.floor( #myTable /n ) do
    print( string.format( 'index %2d   value: %2d',  i,  myTable[i] ) )
    n = n -1
    if n == 0 then break end
end

输出:

index 1 value: 1

index 4 value: 4

index 7 value: 7

index 10 value: 10

index 13 value: 13

index 16 value: 16


编辑:

通过拆分余数的差来居中值。

local myTable = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}

local n = 4
local step = math.floor( #myTable /n )
begin = math.floor( math.max( 1,  ( #myTable -((n -1) *step) +1 ) /2 ) )

for i=begin,  #myTable,  step do
    print( string.format( 'index %2d   value: %2d',  i,  myTable[i] ) )
    n = n -1
    if n == 0 then break end
end

输出:

index 3 value: 3

index 8 value: 8

index 13 value: 13

index 18 value: 18

2020-11-11 07:56:26