Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Random 如何处理Lua math随机异常_Random_Lua_Except - Fatal编程技术网

Random 如何处理Lua math随机异常

Random 如何处理Lua math随机异常,random,lua,except,Random,Lua,Except,我需要一些Lua代码方面的帮助。其思想是获得一个随机数0-18,但它不能是数字8或16。我该怎么做 self.currentSkyTexture = math.random(0,18) --不是8或16。。。如何操作?只要检查它是8还是16,然后重新运行随机数,只要它是其中的一个。因为在19个可能的随机数中只有2个例外,暴力方法不会导致性能问题 function myRandom() local ret repeat ret = math.random(0,18

我需要一些Lua代码方面的帮助。其思想是获得一个随机数
0
-
18
,但它不能是数字
8
16
。我该怎么做

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

--不是
8
16
。。。如何操作?

只要检查它是8还是16,然后重新运行随机数,只要它是其中的一个。

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

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

self.currentSkyTexture = myRandom()

做一张答案表

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

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

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 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()
函数makeExcludedRandom(最小、最大、排除)
局部值={}
局部i=0
局部j=0
表.排序(排除)
而我
简单解决方案(如果使用少量数字,则使用第一个答案)


如果这是@WerewolF经常做的那种随机操作,那么这是一个更优雅、更干燥的解决方案。你怎么会认为它比查表更快呢?你对备选方案进行基准测试了吗?没有,但你让我对我的假设感到好奇。在lua-5.1中,我的速度快了5%。在5.2中,您的速度比我的快5%,而在luajit 2.0.3中,您的速度比我的快8%。在所有情况下,重复调用random都比失败的慢10-15%;对于10000000次迭代,skipRandom 0m8.138s;基于表格的myRandom 0m7.509是列表中的双重
15
是故意的还是仅仅是一个输入错误?@greatwolf,这是一个输入错误
function randomize()
    local r = math.random(0,18);
    if (r == 8 or r == 16) then 
        return randomize();
    end
    return r;
end