Example #1
0
        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);
        }
Example #2
0
        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());
        }