public static void TestHalf() { WeightedSet <int> set = new WeightedSet <int>(); set.Add(0, 0.5f); set.Add(1, 0.5f); float result = (float)Enumerable.Range(1, 100000).Select(i => set.RandomTake()).Average(); UnityEngine.Debug.Log($"result = {result}"); Assert.LessOrEqual(Math.Abs(result - 0.5f), 0.01f); }
public static int[][] RandomTree_Edges(Random rnd, int verticesCount, int maxChildCount, bool doPermutation = true) { var vertices = new int[verticesCount]; for (var i = 0; i < verticesCount; i++) { vertices[i] = i; } var edges = new List <int[]>(); var childCount = new int[verticesCount]; var added = new WeightedSet <int>(); added.Add(0, 1d); for (var i = 1; i < verticesCount; i++) { if (added.Count == 0) { break; } var parent = added.RandomElement(rnd); edges.Add(new[] { parent, i }); childCount[parent]++; added.Add(i, 1d); added.MultiplyWeight(parent, 0.5); if (childCount[parent] == maxChildCount) { added.Remove(parent); } } if (doPermutation) { var permutation = vertices.ToArray().Shuffle(rnd); foreach (var edge in edges) { edge[0] = permutation[edge[0]]; edge[1] = permutation[edge[1]]; } } return(edges.ToArray()); }