/// <summary> /// 以积分为概率大小,返回幸运者的索引号 /// </summary> /// <param name="points">积分数组,正整数</param> static int GetLuckyOne(int[] points, Random random) { // 检验参数 if (points == null || points.Length < 1) throw new ArgumentException(); if (random == null) random = new Random(); // 准备累计数组 int[] accumulation = new int[points.Length]; accumulation[0] = points[0]; for (int i = 1; i < accumulation.Length; i++) { accumulation[i] = points[i] + accumulation[i - 1]; } // 用总累计值为上限产生一随机数 int randomNumber = random.Next(accumulation[accumulation.Length - 1]); // 二分法查询该随机数的归属区间 int luckyOne = Array.BinarySearch<int>(accumulation, randomNumber); if (luckyOne < 0) luckyOne = ~luckyOne; return luckyOne; }