加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-14 21:45:17 所属栏目:大数据 来源:网络整理
导读:我正在用lua语言编写一个使用Corona SDK的游戏.我很难为这样的系统提出逻辑; 我有不同的项目.我想要一些物品有1/1000的机会被选中(一个独特的物品),我想要一些有1/10,一些2/10等. 我在考虑填充一张桌子并挑选一个随机物品.例如,我将100个“X”项添加到表中,
我正在用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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读