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 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 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");
    }
Exemple #5
0
 private void Swap(int indexA, int indexB)
 {
     if (indexA != indexB)
     {
         WeightedElement temp = this.data[indexA];
         this.data[indexA] = this.data[indexB];
         this.data[indexB] = temp;
     }
 }
        public void Add(T element, int weight)
        {
            WeightedElement newElement = new WeightedElement(element, weight);

            objectList.Add(newElement);
            int index = objectList.IndexOf(newElement);

            for (int i = 0; i < weight; i++)
            {
                availableIndices.Add(index);
            }
        }
        private IEnumerable <IWeightedElement <int?> > GetPossibleFishWithoutFarm(Farmer who, string locationName, WaterType water, SDate date, Weather weather, int time, int fishLevel, int?mineLevel = null)
        {
            // Check if this is the farm
            if (locationName == "Farm" && !this.GetFarmFishing())
            {
                return new[] { new WeightedElement <int?>(null, 1) }
            }
            ;

            // Get chance for fish
            float fishChance = this.GetFishChance(who);

            // Get fish data for location
            IEnumerable <KeyValuePair <int, IFishData> > locFish = this.GetFishData(locationName);

            if (FishingApi._mineLocRegex.IsMatch(locationName))
            {
                locFish = locFish.Concat(this.GetFishData("UndergroundMine"));
            }

            // Filter all the fish that can be caught at that location
            IEnumerable <IWeightedElement <int?> > fish = locFish.Where(f => {
                // Legendary fish criteria
                if (this.IsLegendary(f.Key))
                {
                    // If custom legendaries is disabled, then don't include legendary fish. They are handled in CustomFishingRod
                    if (!ModFishing.Instance.MainConfig.CustomLegendaries)
                    {
                        return(false);
                    }

                    // If recatchable legendaries is disabled, then make sure this fish hasn't been caught yet
                    if (!ModFishing.Instance.MainConfig.RecatchableLegendaries && who.fishCaught.ContainsKey(f.Key))
                    {
                        return(false);
                    }
                }

                // Normal criteria check
                return(f.Value.MeetsCriteria(f.Key, water, date, weather, time, fishLevel, mineLevel));
            }).ToWeighted(kv => kv.Value.GetWeight(who), kv => (int?)kv.Key);

            // Include trash
            IEnumerable <IWeightedElement <int?> > trash = new WeightedElement <int?>(null, 1).Yield();

            // Combine fish with trash
            return(fish.NormalizeTo(fishChance).Concat(trash.NormalizeTo(1 - fishChance)));
        }
Exemple #8
0
        public void ChangeWeight(T element, TWeight weight)
        {
            WeightedElement foundElement = null;
            int             foundIndex   = -1;

            for (int i = 0; i < this.data.Length; i++)
            {
                if (EqualityComparer <T> .Default.Equals(this.data[i].Element, element))
                {
                    foundElement = this.data[i];
                    foundIndex   = i;
                    break;
                }
            }

            if (foundIndex == -1)
            {
                throw new InvalidOperationException("Element not found.");
            }

            foundElement.Weight = weight;
            BubbleUp(foundIndex);
            BubbleDown(foundIndex);
        }
Exemple #9
0
 private bool GreaterThan(WeightedElement a, WeightedElement b)
 {
     return(a.Weight.CompareTo(b.Weight) > 0);
 }