LootTable概率分布的简化

时间:2015-09-19 21:09:21

标签: c# optimization probability

我为我正在制作的爱好游戏创建了一个简单的LootTable类,它的工作原理非常好。但是,我很清楚代码中存在的缺陷。当我说缺陷时,我的意思是:实现的一个区域可以改进/简化,以减轻处理/计算成本。我将尝试尽可能地解释这一点,在此之前,这里是我的LootTable类的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using DreamforceFramework.Framework.Game.Logic.Structs;
using DreamforceFramework.Framework.Probability;

namespace DreamforceFramework.Framework.Game.Probability
{
    public class LootTable
    {
        public string Name;
        private readonly List<string> _lootTable;
        private readonly Dictionary<string, int> _cachedLoot;
        private bool _isRebuildRequired;

        public LootTable()
        {
            _cachedLoot = new Dictionary<string, int>();
            _lootTable = new List<string>();
        }

        public LootTable(string name)
        {
            this.Name = name;
            _cachedLoot = new Dictionary<string, int>();
            _lootTable = new List<string>();
        }

        public void Add(string name, int probability)
        {
            this._cachedLoot.Add(name, probability);
            _isRebuildRequired = true;
        }

        public bool Contains(string name)
        {
            return _cachedLoot.ContainsKey(name);
        }

        public void Add(LootTableItem item)
        {
            this._cachedLoot.Add(item.Name, item.Rarity);
            _isRebuildRequired = true;
        }

        public void Add(List<LootTableItem> items)
        {
            foreach (LootTableItem lootTableItem in items)
            {
                this._cachedLoot.Add(lootTableItem.Name, lootTableItem.Rarity);
            }
            _isRebuildRequired = true;
        }

        public void Remove(string name)
        {
            this._cachedLoot.Remove(name);
            _isRebuildRequired = true;
        }

        public double ComputeProbability(string name)
        {
            double total = _cachedLoot.Values.Sum(n => n);
            double percent = _cachedLoot[name] / total;
            return Math.Round(percent * 100, 2);
        }

        public void Edit(string name, int newProbability)
        {
            this._cachedLoot[name] = newProbability;
            _isRebuildRequired = true;
        }

        public void Clear()
        {
            this._cachedLoot.Clear();
            this._isRebuildRequired = true;
        }

        private void Rebuild()
        {
            _lootTable.Clear();
            foreach (KeyValuePair<string, int> pair in _cachedLoot)
            {
                for (int i = 0; i < pair.Value; i++)
                {
                    _lootTable.Add(pair.Key);
                }
            }
            _isRebuildRequired = false;
        }

        public string Next()
        {
            if (_isRebuildRequired)
            {
                this.Rebuild();
            }
            return _lootTable[DreamforceRandom.NextInteger(_lootTable.Count)];
        }

        public List<string> Next(int quantity)
        {
            List<string> returnList = new List<string>();
            if (_isRebuildRequired)
            {
                this.Rebuild();
            }
            for (int i = 0; i < quantity; i++)
            {
                returnList.Add(_lootTable[DreamforceRandom.NextInteger(_lootTable.Count)]);
            }
            return returnList;
        }
    }
}

还有LootTableItem结构:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DreamforceFramework.Framework.Game.Logic.Structs
{
    public struct LootTableItem
    {
        public string Name;
        public int Rarity;
        public LootTableItem(string name, int rarity)
        {
            this.Name = name;
            this.Rarity = rarity;
        }
    }
}

对于那些浏览上述代码的人,您会看到我所谈论的效率低下的区域。为了生成内部战利品表,我创建了一个字符串列表,它等于项目的稀有性。所以说我把“生锈的剑”放入战利品表中,稀罕度为20.这意味着当重建战利品表时,它会在表中添加20个“生锈之剑”字符串。没什么大不了的?但现在让我们说我要添加两个对象。我在战利品表中添加值为100的“Ruby”和值为100的“Emerald”。好吧,这意味着我将在战利品表中创建200个字符串,当它可以简化为添加1个Ruby字符串和1个Emerald字符串时,这非常愚蠢。这将达到相同的概率,即50/50。

所以我的问题是:如何简化项目添加到LootTable的概率,以便自动优化数据,而不是创建一个巨大的字符串列表。

我希望我能够清楚地解释这一点,当涉及到书面表达时,我有时候很缺乏。

编辑:

以下是所选答案提出的有效解决方案: http://pastebin.com/4w0B0V6y

0 个答案:

没有答案