我需要一些Lua代碼的幫助。想法是得到一個隨機數0
- 18
但它不能是數字8
或16
。我怎樣才能做到這一點?如何做Lua數學隨機異常
self.currentSkyTexture = math.random(0,18)
- 不是8
或16
......怎麼樣?
我需要一些Lua代碼的幫助。想法是得到一個隨機數0
- 18
但它不能是數字8
或16
。我怎樣才能做到這一點?如何做Lua數學隨機異常
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
每個。
名單上的雙'15'是故意還是錯字? – greatwolf 2015-02-10 04:01:41
@greatwolf,這是一個錯字 – 2015-02-10 04:14:21
@greatwolf,謝謝,我修正了錯字。 – 2015-02-10 22:33:12
在最簡單的情況下,可以通過它們直接檢查替換排除:
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:05:52
不,但你讓我好奇我的假設。在lua-5.1中,我的速度提高了5%。在5.2中你的速度提高了5%,而在luajit 2.0.3中,你的速度比我的快8%。在所有情況下,重複的隨機呼叫比失敗者慢10-15%。 – 2015-02-10 02:24:06
我在一個微小的(Atom處理器)Debian Wheezy Lua 5.2.1上運行了一個microbenchmark,兩種方法相當。對於10,000,000次迭代,skipRandom 0m8.138s;基於表格myRandom 0m7.509s – 2015-02-10 02:38:34
只是爲了好玩,這將產生排斥陣列和功能的具體參數:
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()
簡單解決方案(如果使用少量的數字使用第一個答案)。
function randomize()
local r = math.random(0,18);
if (r == 8 or r == 16) then
return randomize();
end
return r;
end
如果這是@WerewolF將經常做的隨機事件,這是一種更優雅的DRY解決方案。 – 2015-02-10 01:32:04