public void WeightedListBasicWithIntegerElementsWeightsTest()
    {
        int             testsNum = 100000;
        WeightedElement element1 = new WeightedElement(1f);
        WeightedElement element3 = new WeightedElement(3f);
        WeightedElement element6 = new WeightedElement(6f);

        Dictionary <WeightedElement, int> chosenElementNums = new Dictionary <WeightedElement, int>();

        chosenElementNums.Add(element1, 0);
        chosenElementNums.Add(element3, 0);
        chosenElementNums.Add(element6, 0);

        WeightedList <WeightedElement> weightedList = new WeightedList <WeightedElement>(new List <WeightedElement>
        {
            element1,
            element3,
            element6,
        });

        for (int i = 0; i < testsNum; i++)
        {
            WeightedElement chosenElement = weightedList.GetRandomWeightedElement();
            chosenElementNums[chosenElement]++;
        }

        Assert.GreaterOrEqual(chosenElementNums[element1], 9000, "Element with a weight of 1");
        Assert.LessOrEqual(chosenElementNums[element1], 11000, "Element with a weight of 1");
        Assert.GreaterOrEqual(chosenElementNums[element3], 29000, "Element with a weight of 3");
        Assert.LessOrEqual(chosenElementNums[element3], 31000, "Element with a weight of 3");
        Assert.GreaterOrEqual(chosenElementNums[element6], 59000, "Element with a weight of 6");
        Assert.LessOrEqual(chosenElementNums[element6], 61000, "Element with a weight of 6");
    }
    public void WeightedListWithFloatElementWeights()
    {
        int             testsNum  = 100000;
        WeightedElement element37 = new WeightedElement(3.7f);
        WeightedElement element20 = new WeightedElement(2f);
        WeightedElement element43 = new WeightedElement(4.3f);

        Dictionary <WeightedElement, int> chosenElementNums = new Dictionary <WeightedElement, int>();

        chosenElementNums.Add(element37, 0);
        chosenElementNums.Add(element20, 0);
        chosenElementNums.Add(element43, 0);

        WeightedList <WeightedElement> weightedList = new WeightedList <WeightedElement>(new List <WeightedElement>
        {
            element37,
            element20,
            element43,
        });

        for (int i = 0; i < testsNum; i++)
        {
            WeightedElement chosenElement = weightedList.GetRandomWeightedElement();
            chosenElementNums[chosenElement]++;
        }

        Assert.GreaterOrEqual(chosenElementNums[element37], 36000, "Element with a weight of 3.7f");
        Assert.LessOrEqual(chosenElementNums[element37], 38000, "Element with a weight of 3.7f");
        Assert.GreaterOrEqual(chosenElementNums[element20], 19000, "Element with a weight of 2f");
        Assert.LessOrEqual(chosenElementNums[element20], 21000, "Element with a weight of 2f");
        Assert.GreaterOrEqual(chosenElementNums[element43], 42000, "Element with a weight of 4.3f");
        Assert.LessOrEqual(chosenElementNums[element43], 44000, "Element with a weight of 4.3f");
    }
    public void WeightedList0WeightOnAllElements()
    {
        int             testsNum   = 100000;
        WeightedElement element0   = new WeightedElement(0f);
        WeightedElement element00  = new WeightedElement(0f);
        WeightedElement element000 = new WeightedElement(0f);

        Dictionary <WeightedElement, int> chosenElementNums = new Dictionary <WeightedElement, int>();

        chosenElementNums.Add(element0, 0);
        chosenElementNums.Add(element00, 0);
        chosenElementNums.Add(element000, 0);

        WeightedList <WeightedElement> weightedList = new WeightedList <WeightedElement>(new List <WeightedElement>
        {
            element0,
            element00,
            element000,
        });

        for (int i = 0; i < testsNum; i++)
        {
            WeightedElement chosenElement = weightedList.GetRandomWeightedElement();
            chosenElementNums[chosenElement]++;
        }

        Assert.GreaterOrEqual(chosenElementNums[element0], 32333, "First element with a weight of 0f");
        Assert.LessOrEqual(chosenElementNums[element0], 34333, "First element with a weight of 0f");
        Assert.GreaterOrEqual(chosenElementNums[element00], 32333, "Second element with a weight of 0f");
        Assert.LessOrEqual(chosenElementNums[element00], 34333, "Second element with a weight of 0f");
        Assert.GreaterOrEqual(chosenElementNums[element000], 32333, "Third element with a weight of 0f");
        Assert.LessOrEqual(chosenElementNums[element000], 34333, "Third element with a weight of 0f");
    }
    public void WeightedListWith0ElementWeightTest()
    {
        int             testsNum = 100000;
        WeightedElement element4 = new WeightedElement(4f);
        WeightedElement element0 = new WeightedElement(0f);
        WeightedElement element6 = new WeightedElement(6f);

        Dictionary <WeightedElement, int> chosenElementNums = new Dictionary <WeightedElement, int>();

        chosenElementNums.Add(element4, 0);
        chosenElementNums.Add(element0, 0);
        chosenElementNums.Add(element6, 0);

        WeightedList <WeightedElement> weightedList = new WeightedList <WeightedElement>(new List <WeightedElement>
        {
            element4,
            element0,
            element6,
        });

        for (int i = 0; i < testsNum; i++)
        {
            WeightedElement chosenElement = weightedList.GetRandomWeightedElement();
            chosenElementNums[chosenElement]++;
        }

        Assert.GreaterOrEqual(chosenElementNums[element4], 39000, "Element with a weight of 4f");
        Assert.LessOrEqual(chosenElementNums[element4], 41000, "Element with a weight of 4f");
        Assert.AreEqual(chosenElementNums[element0], 0, "Element with a weight of 0f");
        Assert.GreaterOrEqual(chosenElementNums[element6], 59000, "Element with a weight  of 6f");
        Assert.LessOrEqual(chosenElementNums[element6], 61000, "Element with a weight of 6f");
    }
    public MeatData ChooseMeatToBuy()
    {
        WeightedList <MeatPopularity> meatsToChooseFrom = new WeightedList <MeatPopularity>(NpcCharacterBehaviour.CurrentCityRegion.meatsPopularity.List);
        MeatData chosenMeat = null;

        while (!chosenMeat && meatsToChooseFrom.List.Count > 0)
        {
            MeatPopularity tempChosenMeatPopularity = meatsToChooseFrom.GetRandomWeightedElement();
            chosenMeat = GameManager.Instance.Player.Inventory.HasMeatType(tempChosenMeatPopularity.meatData) ? tempChosenMeatPopularity.meatData : null;
            if (!chosenMeat)
            {
                if (tempChosenMeatPopularity.thisOrNothing)
                {
                    break;
                }
                else
                {
                    meatsToChooseFrom.List.Remove(tempChosenMeatPopularity);
                }
            }
        }

        if (!chosenMeat)
        {
            NoMeatBought();
        }

        return(chosenMeat);
    }