namespace System { public class Beta { //[UnityEditor.MenuItem("Tools/TestBeta")] //void TestBeta() //{ // List doubles = new List(); // for (int i = 0; i < 10000; i++) // { // doubles.Add(Beta.Sample(100, 900)); // } // doubles.Sort(); // for (int i = 0; i < doubles.Count; i++) // { // int s = (int)(doubles[i] * 100); // Debug.Log(s); // } //} static double GammaSampleUnchecked(System.Random rnd, double shape, double rate) { if (double.IsPositiveInfinity(rate)) { return shape; } double num = shape; double num2 = 1.0; if (shape < 1.0) { num = shape + 1.0; num2 = System.Math.Pow(rnd.NextDouble(), 1.0 / shape); } double num3 = num - 1.0 / 3.0; double num4 = 1.0 / System.Math.Sqrt(9.0 * num3); double num6; double num7; double num5; do { num5 = NormalSampleUnchecked(rnd, 0.0, 1.0); for (num6 = 1.0 + num4 * num5; num6 <= 0.0; num6 = 1.0 + num4 * num5) { num5 = NormalSampleUnchecked(rnd, 0.0, 1.0); } num6 = num6 * num6 * num6; num7 = rnd.NextDouble(); num5 *= num5; if (num7 < 1.0 - 0.0331 * num5 * num5) { return num2 * num3 * num6 / rate; } } while (!(System.Math.Log(num7) < 0.5 * num5 + num3 * (1.0 - num6 + System.Math.Log(num6)))); return num2 * num3 * num6 / rate; } static double NormalSampleUnchecked(System.Random rnd, double mean, double stddev) { double x; double y; while (!PolarTransform(rnd.NextDouble(), rnd.NextDouble(), out x, out y)) { } return mean + stddev * x; } static bool PolarTransform(double a, double b, out double x, out double y) { double num = 2.0 * a - 1.0; double num2 = 2.0 * b - 1.0; double num3 = num * num + num2 * num2; if (num3 >= 1.0 || num3 == 0.0) { x = 0.0; y = 0.0; return false; } double num4 = Math.Sqrt(-2.0 * Math.Log(num3) / num3); x = num * num4; y = num2 * num4; return true; } public static double Sample(double alpha, double beta) { System.Random rng = new System.Random(); double num; double num2; if (alpha == beta) { num = GammaSampleUnchecked(rng, alpha, 1.0); num2 = GammaSampleUnchecked(rng, beta, 1.0); if (num == 0.0 && num2 == 0.0) { if (rng.NextDouble() < 0.5f) { return 1; } return 0; } } else { do { num = GammaSampleUnchecked(rng, alpha, 1.0); num2 = GammaSampleUnchecked(rng, beta, 1.0); } while (num == 0.0 && num2 == 0.0); } return num / (num + num2); } } }