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"); }
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))); }
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); }
private bool GreaterThan(WeightedElement a, WeightedElement b) { return(a.Weight.CompareTo(b.Weight) > 0); }