1
0
Fork 0
mirror of https://github.com/Ellpeck/MLEM.git synced 2024-11-25 14:08:34 +01:00

Allow RandomExtensions to operate on any ICollection

This commit is contained in:
Ell 2022-07-19 15:20:19 +02:00
parent e673ccea61
commit 48dfa8f1ee
2 changed files with 9 additions and 7 deletions

View file

@ -26,6 +26,7 @@ Improvements
- Allow using multiple textures in a StaticSpriteBatch - Allow using multiple textures in a StaticSpriteBatch
- Added GenericInput support for Buttons.None - Added GenericInput support for Buttons.None
- Improved the way terminating formatting codes work by introducing SimpleEndCode - Improved the way terminating formatting codes work by introducing SimpleEndCode
- Allow RandomExtensions to operate on any ICollection
Removals Removals
- Marked AStar.InfiniteCost as obsolete - Marked AStar.InfiniteCost as obsolete

View file

@ -9,18 +9,19 @@ namespace MLEM.Extensions {
public static class RandomExtensions { public static class RandomExtensions {
/// <summary> /// <summary>
/// Gets a random entry from the given list with uniform chance. /// Gets a random entry from the given collection with uniform chance.
/// </summary> /// </summary>
/// <param name="random">The random</param> /// <param name="random">The random</param>
/// <param name="entries">The entries to choose from</param> /// <param name="entries">The entries to choose from</param>
/// <typeparam name="T">The entries' type</typeparam> /// <typeparam name="T">The entries' type</typeparam>
/// <returns>A random entry</returns> /// <returns>A random entry</returns>
public static T GetRandomEntry<T>(this Random random, IList<T> entries) { public static T GetRandomEntry<T>(this Random random, ICollection<T> entries) {
return entries[random.Next(entries.Count)]; // ElementAt internally optimizes for IList access so we don't have to here
return entries.ElementAt(random.Next(entries.Count));
} }
/// <summary> /// <summary>
/// Returns a random entry from the given list based on the specified weight function. /// Returns a random entry from the given collection based on the specified weight function.
/// A higher weight for an entry increases its likeliness of being picked. /// A higher weight for an entry increases its likeliness of being picked.
/// </summary> /// </summary>
/// <param name="random">The random</param> /// <param name="random">The random</param>
@ -29,7 +30,7 @@ namespace MLEM.Extensions {
/// <typeparam name="T">The entries' type</typeparam> /// <typeparam name="T">The entries' type</typeparam>
/// <returns>A random entry, based on the entries' weight</returns> /// <returns>A random entry, based on the entries' weight</returns>
/// <exception cref="IndexOutOfRangeException">If the weight function returns different weights for the same entry</exception> /// <exception cref="IndexOutOfRangeException">If the weight function returns different weights for the same entry</exception>
public static T GetRandomWeightedEntry<T>(this Random random, IList<T> entries, Func<T, int> weightFunc) { public static T GetRandomWeightedEntry<T>(this Random random, ICollection<T> entries, Func<T, int> weightFunc) {
var totalWeight = entries.Sum(weightFunc); var totalWeight = entries.Sum(weightFunc);
var goalWeight = random.Next(totalWeight); var goalWeight = random.Next(totalWeight);
var currWeight = 0; var currWeight = 0;
@ -41,8 +42,8 @@ namespace MLEM.Extensions {
throw new IndexOutOfRangeException(); throw new IndexOutOfRangeException();
} }
/// <inheritdoc cref="GetRandomWeightedEntry{T}(System.Random,System.Collections.Generic.IList{T},System.Func{T,int})"/> /// <inheritdoc cref="GetRandomWeightedEntry{T}(System.Random,System.Collections.Generic.ICollection{T},System.Func{T,int})"/>
public static T GetRandomWeightedEntry<T>(this Random random, IList<T> entries, Func<T, float> weightFunc) { public static T GetRandomWeightedEntry<T>(this Random random, ICollection<T> entries, Func<T, float> weightFunc) {
var totalWeight = entries.Sum(weightFunc); var totalWeight = entries.Sum(weightFunc);
var goalWeight = random.NextDouble() * totalWeight; var goalWeight = random.NextDouble() * totalWeight;
var currWeight = 0F; var currWeight = 0F;