如何处理Lua中的math.random异常情况?

我需要一点关于 Lua 代码的帮助。我的想法是获取一个随机数字 0 - 18,但不能是数字 816。我该怎么做?

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

-- 不包含数字 816... 怎么做呢?

点赞
用户2905195
用户2905195

只需检查它是否为8或16,如果是这两个中的任何之一,请重新运行随机函数。

2015-02-10 01:26:04
用户1009479
用户1009479

由于在19个可能的随机数字中只有2个例外,因此暴力方法不会导致性能问题。

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

self.currentSkyTexture = myRandom()
2015-02-10 01:29:19
用户33252
用户33252

制作一个答案表格

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

2015-02-10 01:56:03
用户4402825
用户4402825

在最简单的情况下,您可以通过直接检查来替换排除:

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()
2015-02-10 02:02:26
用户4402825
用户4402825

为了好玩,这将生成特定参数的排除数组和函数:

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()
2015-02-10 03:12:06
用户4261756
用户4261756

简单解决方案(如果使用较少数量的数字,请使用第一个答案)。

function randomize()
    local r = math.random(0,18);
    if (r == 8 or r == 16) then
        return randomize();
    end
    return r;
end
2015-02-10 08:02:47