Пример #1
0
        /// <summary>
        /// 索引权重随机
        /// </summary>
        public static List <int> MTRandomIndex(List <int> weights, int count, MersenneTwisterRandom mtRandom)
        {
            int weightCount = weights.Count();

            if (weightCount == 0 || count <= 0)
            {
                return(null);
            }

            int totalWeight = 0;

            for (int i = 0; i < weightCount; i++)
            {
                totalWeight += weights[i];
            }

            if (totalWeight <= 0)
            {
                return(null);
            }

            List <int>    resultIndexes = new List <int>(count);
            HashSet <int> resultTags    = new HashSet <int>();

            while (resultIndexes.Count < count)
            {
                int randomWeight  = mtRandom.Next(0, totalWeight);
                int currentWeight = 0;

                for (int i = 0; i < weightCount; i++)
                {
                    currentWeight += weights[i];

                    if (currentWeight > randomWeight)
                    {
                        if (!resultTags.Contains(i))
                        {
                            resultIndexes.Add(i);
                            resultTags.Add(i);
                        }

                        break;
                    }
                }
            }

            return(resultIndexes);
        }
Пример #2
0
        /// <summary>
        /// 随机从 [0,max) 中取出不重复的 num 个整数
        /// </summary>
        public static int[] MTRandomNumbers(int num, int max, MersenneTwisterRandom mtRandom)
        {
            if (num < 0 || max < 0 || num > max)
            {
                return(null);
            }

            int[] result = new int[num];
            int[] seed   = new int[max];

            for (int i = 0; i < max; i++)
            {
                seed[i] = i;
            }

            for (int i = 0; i < num; i++)
            {
                int index = mtRandom.Next(0, max - i);
                result[i]   = seed[index];
                seed[index] = seed[num - i - 1];
            }

            return(result);
        }
Пример #3
0
 public static int MTRandom(int min, int max, MersenneTwisterRandom mtRandom)
 {
     return(mtRandom.Next(min, max));
 }