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
似乎您将步幅和检索项混淆了。如果您希望相同,它们可以是相同的值,但不必如此。
#! /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
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

看起来你想要这样的东西?
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})