Как сделать 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()