1
0
Fork 0
mirror of https://github.com/Ellpeck/MLEM.git synced 2024-06-23 21:30:05 +02:00
MLEM/MLEM/Extensions/RandomExtensions.cs

47 lines
2 KiB
C#
Raw Normal View History

2019-08-06 14:20:11 +02:00
using System;
using System.Collections.Generic;
using System.Linq;
2019-08-06 14:20:11 +02:00
namespace MLEM.Extensions {
public static class RandomExtensions {
2020-05-20 23:59:40 +02:00
/// <summary>
/// Gets a random entry from the given list with uniform chance.
/// </summary>
/// <param name="random">The random</param>
/// <param name="entries">The entries to choose from</param>
/// <typeparam name="T">The entries' type</typeparam>
/// <returns>A random entry</returns>
2019-08-06 14:20:11 +02:00
public static T GetRandomEntry<T>(this Random random, params T[] entries) {
return entries[random.Next(entries.Length)];
}
2020-05-20 23:59:40 +02:00
/// <inheritdoc cref="GetRandomEntry{T}(System.Random,T[])"/>
2019-08-06 14:20:11 +02:00
public static T GetRandomEntry<T>(this Random random, IList<T> entries) {
return entries[random.Next(entries.Count)];
}
2020-05-20 23:59:40 +02:00
/// <summary>
/// Returns a random entry from the given list based on the specified weight function.
/// A higher weight for an entry increases its likeliness of being picked.
/// </summary>
/// <param name="random">The random</param>
/// <param name="entries">The entries to choose from</param>
/// <param name="weightFunc">A function that applies weight to each entry</param>
/// <typeparam name="T">The entries' type</typeparam>
/// <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>
public static T GetRandomWeightedEntry<T>(this Random random, IList<T> entries, Func<T, int> weightFunc) {
var totalWeight = entries.Sum(weightFunc);
var goalWeight = random.Next(totalWeight);
var currWeight = 0;
foreach (var entry in entries) {
currWeight += weightFunc(entry);
if (currWeight >= goalWeight)
return entry;
}
throw new IndexOutOfRangeException();
}
2019-08-06 14:20:11 +02:00
}
}