假設我有這張桌子。
Config.LootboxesRewards = {
[1] = {
{name = 'a45amg', label = 'Mercedes A45 AMG ', amount = 1, type = 'car', luck = 3},
{name = '720s', label = '720s mclaren', amount = 1, type = 'car', luck = 20},
{name = 'bac2', label = 'bac2', amount = 1, type = 'car', luck = 20},
{name = 'm6prior', label = 'BMW M6', amount = 1, type = 'car', luck = 19},
{name = 'huracan', label = 'Lamborghini Huracan', amount = 1, type = 'car', luck = 19},
{name = 'yzfr6', label = 'Yamaha R6', amount = 1, type = 'car', luck = 19},
},
}
基于此,我想根據該表上的運氣值給玩家 1 個專案。最好的方法是什么?
uj5u.com熱心網友回復:
最簡單的方法是將指數Config.LootboxesRewards[1]帶math.random(#Config.LootboxesRewards[1])
這假設您只想給您的玩家一個均勻分布的隨機專案。如果你想改變獲得特定物品的機會,我建議你從這里開始:
https://en.wikipedia.org/wiki/Probability
讀:
https://www.lua.org/manual/5.4/manual.html#pdf-math.random
https://www.lua.org/manual/5.4/manual.html#pdf-math.randomseed
uj5u.com熱心網友回復:
一種簡單的解決方案是將具有較高機會(較高運氣值)的值比具有較低變化(較低運氣值)的物品更頻繁地放入戰利品表中。
為了方便起見,您仍然可以保留您的表格并像這樣預處理表格:
local function gcd(a, b)
while a ~= b do
if a > b then
a = a - b
else
b = b - a
end
end
return a
end
local function gcd_tbl(values, value_getter)
if #values < 1 then
return nil
end
value_getter = value_getter or function(v) return v end
local result = value_getter(values[1])
for i = 2, #values do
result = gcd(result, value_getter(values[i]))
end
return result
end
local function process_rewards(tbl)
local result = {}
for id, rewards in pairs(tbl) do
result[id] = {}
local greatest_common_divisor = gcd_tbl(rewards, function(v) return v.luck end)
for _, reward in ipairs(rewards) do
for i = 1, reward.luck / greatest_common_divisor do
table.insert(result[id], reward)
end
end
end
return result
end
Config.LootboxesRewards = process_rewards({
[1] = {
{name = 'a45amg', label = 'Mercedes A45 AMG ', amount = 1, type = 'car', luck = 3},
{name = '720s', label = '720s mclaren', amount = 1, type = 'car', luck = 20},
{name = 'bac2', label = 'bac2', amount = 1, type = 'car', luck = 20},
{name = 'm6prior', label = 'BMW M6', amount = 1, type = 'car', luck = 19},
{name = 'huracan', label = 'Lamborghini Huracan', amount = 1, type = 'car', luck = 19},
{name = 'yzfr6', label = 'Yamaha R6', amount = 1, type = 'car', luck = 19},
}
})
然后,您可以從表中選擇一個隨機索引來查找獎勵:
function get_random_reward(lootbox_id)
local lootbox_rewards = Config.LootboxesRewards[lootbox_id]
if not lootbox_rewards then
return nil
end
return lootbox_rewards[math.random(#lootbox_rewards)]
end
get_random_reward(1)
編輯:如果你想表明相反的方式(更高的運氣=更少的機會掉落),你可以使用這兩個功能:
local function gcd_and_max_tbl(values, value_getter)
if #values < 1 then
return nil, nil
end
value_getter = value_getter or function(v) return v end
local value = value_getter(values[1])
local gcd_result, max_result = value, value
for i = 2, #values do
value = value_getter(values[i])
gcd_result = gcd(gcd_result, value)
max_result = math.max(max_result, value)
end
return gcd_result, max_result
end
local function process_rewards(tbl)
local result = {}
for id, rewards in pairs(tbl) do
result[id] = {}
local greatest_common_divisor, max_luck = gcd_and_max_tbl(rewards, function(v) return v.luck end)
local max_relevant_luck = max_luck / greatest_common_divisor
for _, reward in ipairs(rewards) do
for i = 1, max_relevant_luck - (reward.luck / greatest_common_divisor) 1 do
table.insert(result[id], reward)
end
end
end
return result
end
uj5u.com熱心網友回復:
如果運氣只是被選中的可能性,那么運氣為 10 的汽車比運氣為 5 的汽車有兩倍的機會被選中,您可以這樣做
function pickBasedOnLuck(list)
local totalLuck = 0
for i, car in ipairs(list) do
totalLuck = totalLuck car.luck
end
local pick = math.random(totalLuck)
for i, car in ipairs(list) do
if pick > car.luck then
pick = pick - car.luck
else
return car
end
end
end
所以在你的情況下,它可以被稱為pickBasedOnLuck(Config.LootboxesRewards[1]).
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/367470.html
下一篇:關于Python元組操作
