comment pass
This commit is contained in:
@@ -6,12 +6,25 @@ using Random = System.Random;
|
||||
|
||||
namespace EscapeRoomEngine.Engine.Runtime.Utilities
|
||||
{
|
||||
/// <summary>
|
||||
/// The representation of a normal distribution with a certain mean μ and standard deviation σ.
|
||||
/// </summary>
|
||||
[Serializable]
|
||||
public struct NormalDistribution
|
||||
{
|
||||
public float μ, σ;
|
||||
/// <summary>
|
||||
/// The mean of this distribution.
|
||||
/// </summary>
|
||||
public float μ;
|
||||
/// <summary>
|
||||
/// The standard deviation of this distribution.
|
||||
/// </summary>
|
||||
public float σ;
|
||||
|
||||
public static NormalDistribution Standard => new NormalDistribution { μ = 0, σ = 1 };
|
||||
/// <summary>
|
||||
/// Generate a standard normal distribution.
|
||||
/// </summary>
|
||||
public static NormalDistribution Standard => new() { μ = 0, σ = 1 };
|
||||
|
||||
public NormalDistribution(float[] samples) : this()
|
||||
{
|
||||
@@ -19,13 +32,25 @@ namespace EscapeRoomEngine.Engine.Runtime.Utilities
|
||||
σ = Probability.StandardDeviation(samples, μ);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sample a random value from this distribution.
|
||||
/// </summary>
|
||||
public float Sample() => σ * Probability.Normal() + μ;
|
||||
|
||||
/// <summary>
|
||||
/// Sample the CDF of this distribution.
|
||||
/// </summary>
|
||||
public float Cumulative(float x) => (float)new Normal(μ, σ).CumulativeDistribution(x);
|
||||
|
||||
/// <summary>
|
||||
/// Sample the inverse CDF of this distribution.
|
||||
/// </summary>
|
||||
public float InverseCumulative(float x) => (float)new Normal(μ, σ).InverseCumulativeDistribution(x);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This class is used for probability calculations.
|
||||
/// </summary>
|
||||
public static class Probability
|
||||
{
|
||||
private static readonly Random _random = new();
|
||||
@@ -50,6 +75,9 @@ namespace EscapeRoomEngine.Engine.Runtime.Utilities
|
||||
return u1 * Mathf.Sqrt(-2 * Mathf.Log(square) / square);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Calculate the mean of a list of samples.
|
||||
/// </summary>
|
||||
public static float Mean(float[] samples)
|
||||
{
|
||||
if (samples.Length == 0)
|
||||
@@ -60,7 +88,13 @@ namespace EscapeRoomEngine.Engine.Runtime.Utilities
|
||||
return samples.Sum() / samples.Length;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Calculate the standard deviation of a list of samples.
|
||||
/// </summary>
|
||||
public static float StandardDeviation(float[] samples) => StandardDeviation(samples, Mean(samples));
|
||||
/// <summary>
|
||||
/// Calculate the standard deviation of a list of samples without recalculating the mean.
|
||||
/// </summary>
|
||||
public static float StandardDeviation(float[] samples, float mean)
|
||||
{
|
||||
var deviations = new float[samples.Length];
|
||||
|
||||
Reference in New Issue
Block a user