使用特定的最大值和最小值修改表中的数字

时间:2019-05-11 16:05:30

标签: lua

我有一个基本表,其中包含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。不保留随机性。

干杯:)

2 个答案:

答案 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