我有一个基本表,其中包含32到512之间的随机数。除非表中最小的数字= 32或最大的数字= 512,否则我希望能够将每个数字的值增加或减少10。 / p>
我正在使用钳位方法将我的数字限制为给定值,并且一切都可以工作,但是如果表中的最小数字为32,则所有数字都将减少到最小,而不是函数暂停。因此会全部变为32或512,而不是在其中一个数字达到32或512时停在任何地方。
if math.min(table.unpack(sequences.c1Sequence.data)) >= 32 and math.max(table.unpack(sequences.c1Sequence.data)) <= 512 then
for i, v in ipairs(sequences.c1Sequence.data) do
sequences.c1Sequence.data[i] = util.clamp(v + (10*d), 32, 512)
end
end
每次调用该函数时,要弄清楚“ d”是1还是-1,所以i = i +/- 10,具体取决于输入内容。
钳位功能是:
util.clamp = function(n, min, max)
return math.min(max,(math.max(n,min)))
end
表很简单:
data = {33, 122, 97, 64, 222, 314, 90, 39, 63, 44, 312, 502, 34, 409, 111, 212}
或任何其他随机范围的数字。
我希望当范围在32或512之间的任何数字时,该函数将不执行任何操作,并且数字将不予处理。取而代之的是,如果函数继续接收-1多次,它们全部变为32,或者如果函数不断获得+1,则全部变为512。不保留随机性。
干杯:)
答案 0 :(得分:2)
如果我正确理解了您的问题,请尝试以下操作:
local unpack = unpack or table.unpack
--------------------------------------------------------------------------------
function min(...) --return minimum of all elements
local ans = select(1,...)
if type(ans) == 'table' then ans = min(unpack(ans)) end
for _,n in ipairs { select(2,...) } do
if type(n) == 'table' then n = min(unpack(n)) end
if n < ans then ans = n end
end
return ans
end
--------------------------------------------------------------------------------
function max(...) --return maximum of all elements
local ans = select(1,...)
if type(ans) == 'table' then ans = max(unpack(ans)) end
for _,n in ipairs { select(2,...) } do
if type(n) == 'table' then n = max(unpack(n)) end
if n > ans then ans = n end
end
return ans
end
--------------------------------------------------------------------------------
function pt(t)
print('{'..table.concat(t,', ')..'}')
end
--------------------------------------------------------------------------------
function adjust(t,val)
if min(t)+val < 32 or max(t)+val > 512 then return t end
local ans = {}
for _,x in ipairs(t) do
ans[#ans+1] = x+val
end
return ans
end
--==============================================================================
-- Test
--==============================================================================
data = {33, 122, 97, 64, 222, 314, 90, 39, 63, 44, 312, 502, 34, 409, 111, 212}
pt(data) --original data
data=adjust(data,-1)
pt(data)
data=adjust(data,-1)
pt(data)
data=adjust(data,10)
pt(data)
data=adjust(data,1)
pt(data)
data=adjust(data,1)
pt(data)
答案 1 :(得分:1)
我相信您只需要将比较更改为~=
data = {33, 122, 97, 64, 222, 314, 90, 39, 63, 44, 312, 502, 34, 409, 111, 212}
clamp = function(n, min, max)
return math.min(max,(math.max(n,min)))
end
while (true)do
if math.min(table.unpack(data)) ~= 32 and math.max(table.unpack(data)) ~= 512 then
for i, v in ipairs(data) do
data[i] = clamp(v + (10*-1), 32, 512)
end
else
print(table.unpack(data))
break
end
end
-1输出
32 112 87 54 212 304 80 32 53 34 302 492 32 399 101 202
+1输出
43 132 107 74 232 324 100 49 73 54 322 512 44 419 121 222