Как сделать Lua Math случайное исключение

Мне нужна небольшая помощь с кодом Lua. Идея состоит в том, чтобы получить случайное число 0- 18 но это не может быть число 8 или же 16, Как я могу это сделать?

self.currentSkyTexture = math.random(0,18)

- нет 8 или же 16... как?

6 ответов

Составьте таблицу ответов

local rans = {0,1,2,3,4,5,6,7,9,10,11,12,13,14,15,17,18}

Выберите из таблицы

function myRandom() return rans[math.random(#rans)] end

Это выбирает одну запись из таблицы с одинаковой вероятностью и делает один вызов math.random для каждого.

Поскольку в 19 возможных случайных числах есть только 2 исключения, метод грубой силы не вызовет проблем с производительностью.

function myRandom()
    local ret
    repeat
        ret = math.random(0,18)
    until ret ~= 8 and ret ~= 16
    return ret
end

self.currentSkyTexture = myRandom()

Просто проверьте, 8 или 16, и повторите случайное число, пока оно одно из них.

В простейшем случае вы можете заменить исключения, непосредственно проверив их:

function skipRandom()
    local ret = math.random(0,16)
    if ret == 8 then 
        ret = 17 
    elseif ret == 16 then 
        ret = 18 
    end
    return ret
end

self.currentSkyTexture = skipRandom()

Простое решение (если используется небольшое количество цифр, используйте первый ответ).

function randomize()
    local r = math.random(0,18);
    if (r == 8 or r == 16) then 
        return randomize();
    end
    return r;
end

Просто для удовольствия, это сгенерирует исключающие массивы и функции для определенных параметров:

function makeExcludedRandom(min,max,exclude)
    local values = {}
    local i = 0
    local j = 0
    table.sort(exclude)
    while i < max-min-1 do
       while exclude[j+1] == min+i+j do
          j = j + 1
       end

       values[i+1]=min+i+j
       i=i+1
    end

    return function()
        return values[math.random(min,max)]
    end
end    
local skipRandom = makeExcludedRandom(0,18,{8,16})

self.currentSkyTexture = skipRandom()
Другие вопросы по тегам