当前位置 : 主页 > 网络编程 > lua >

lua – 如何设置正确的逻辑,根据项目的稀有性从列表中选择随机项,即“罕见”

来源:互联网 收集:自由互联 发布时间:2021-06-23
我正在用lua语言编写一个使用Corona SDK的游戏.我很难为这样的系统提出逻辑; 我有不同的项目.我想要一些物品有1/1000的机会被选中(一个独特的物品),我想要一些有1/10,一些2/10等. 我在考虑
我正在用lua语言编写一个使用Corona SDK的游戏.我很难为这样的系统提出逻辑;

我有不同的项目.我想要一些物品有1/1000的机会被选中(一个独特的物品),我想要一些有1/10,一些2/10等.

我在考虑填充一张桌子并挑选一个随机物品.例如,我将100个“X”项添加到表中,而不是1个“Y”项.因此,从[0,101]中随机选择我实现了我想要的东西,但我想知道是否有其他方法可以做到这一点.

items = {
    Cat     = { probability = 100/1000 }, -- i.e. 1/10
    Dog     = { probability = 200/1000 }, -- i.e. 2/10
    Ant     = { probability = 699/1000 },
    Unicorn = { probability =   1/1000 },
}

function getRandomItem()
    local p = math.random()
    local cumulativeProbability = 0
    for name, item in pairs(items) do
        cumulativeProbability = cumulativeProbability + item.probability
        if p <= cumulativeProbability then
            return name, item
        end
    end
end

您希望概率加起来为1.因此,如果您增加项目的概率(或添加项目),您将需要从其他项目中减去.这就是为什么我将1/10写为100/1000:更容易看到事物的分布情况,并在有共同点时更新它们.

您可以确认您正在获得您期望的分发:

local count = { }

local iterations = 1000000
for i=1,iterations do
    local name = getRandomItem()
    count[name] = (count[name] or 0) + 1
end

for name, count in pairs(count) do
    print(name, count/iterations)
end
网友评论