2015-02-10 61 views
3

我需要一些Lua代碼的幫助。想法是得到一個隨機數0 - 18但它不能是數字816。我怎樣才能做到這一點?如何做Lua數學隨機異常

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

- 不是816 ......怎麼樣?

回答

2

只要檢查它是8還是16並重新運行隨機,只要它是其中之一。

2

由於在19個可能的隨機數中只有2個例外,強力方法不會導致性能問題。

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

self.currentSkyTexture = myRandom() 
+0

如果這是@WerewolF將經常做的隨機事件,這是一種更優雅的DRY解決方案。 – 2015-02-10 01:32:04

4

讓答案的表

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每個。

+0

名單上的雙'15'是故意還是錯字? – greatwolf 2015-02-10 04:01:41

+0

@greatwolf,這是一個錯字 – 2015-02-10 04:14:21

+0

@greatwolf,謝謝,我修正了錯字。 – 2015-02-10 22:33:12

2

在最簡單的情況下,可以通過它們直接檢查替換排除:

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() 
+0

是什麼讓你覺得它比查表更快?你有沒有基準的替代品? – 2015-02-10 02:05:52

+0

不,但你讓我好奇我的假設。在lua-5.1中,我的速度提高了5%。在5.2中你的速度提高了5%,而在luajit 2.0.3中,你的速度比我的快8%。在所有情況下,重複的隨機呼叫比失敗者慢10-15%。 – 2015-02-10 02:24:06

+0

我在一個微小的(Atom處理器)Debian Wheezy Lua 5.2.1上運行了一個microbenchmark,兩種方法相當。對於10,000,000次迭代,skipRandom 0m8.138s;基於表格myRandom 0m7.509s – 2015-02-10 02:38:34

0

只是爲了好玩,這將產生排斥陣列和功能的具體參數:

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() 
0

簡單解決方案(如果使用少量的數字使用第一個答案)。

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