Random 如何处理Lua math随机异常
我需要一些Lua代码方面的帮助。其思想是获得一个随机数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
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