Изменение чисел в таблице с определенным максимальным и минимальным значением - PullRequest
2 голосов
/ 11 мая 2019

У меня есть базовая таблица, содержащая случайные числа от 32 до 512. Я хочу иметь возможность увеличивать и уменьшать значение каждого числа на 10, если только наименьшее число в таблице не равно = 32 или наибольшее не равно = 512.

Я использую метод зажима, чтобы ограничить свои числа заданными значениями, и все работает, однако все числа будут уменьшены до самого низкого значения вместо приостановки функции, если самое низкое число в таблице равно 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 +/- 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 ]

2 голосов
/ 12 мая 2019

Если я правильно понял вашу проблему, попробуйте следующее:

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 голос
/ 12 мая 2019

Я считаю, что вам просто нужно изменить сравнение на ~=

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...