【算法】在某个数据集合中随机取N个数使其和在某个区间范围内

问题描述:在某个数据集合中随机取N个数使其和在某个区间范围内

前提:
1、随机取N个数——随机取数 2、数据集合中的数可复用
private void Use() { //数据准备 List initList = new List(); for (int i = 1; i <= 30; i++) { initList.Add(i); } //在initList集合中随机取7个数,使其和在30,40中间 GetRandomNumberInSpecialArea(initList, 7, 30, 40); }/// /// /// 前提:1.随机取数 ///2.数据可重复使用 /// /// 在固定集合中随机取N个数使其和在某个区间范围内 /// /// /// 【【算法】在某个数据集合中随机取N个数使其和在某个区间范围内】固定集合 /// 取N个数 /// 区间最小范围 /// 区间最大范围 /// public List GetRandomNumberInSpecialArea(List initList, int getCount, int minArea, int maxArea) { var resultList = new List(); var maxNumber = maxArea - initList.Min() * getCount; var minNumber = minArea - initList.Max() * getCount; for (int i = 0; i < getCount; i++) { if (initList.Where(x => x < maxNumber).Count() != 0) { //随机取出满足条件的数据中的一个 var randomTemp = initList.Where(x => x < maxNumber && x > minNumber).ToList().GetRandomMember(); resultList.Add(randomTemp); //重新计算最大值最小值 maxNumber = maxArea - resultList.Sum() - initList.Min() * (getCount - resultList.Count); minNumber = minArea - resultList.Sum() - initList.Max() * (getCount - resultList.Count); } else { //没有符合的数据 break; } } //找不到符合情况的数据 if (resultList.Count != getCount) return null; return resultList; }

上面用到了一个随机排序的扩展方法
/// /// 随机获取List中的某一对象 /// /// /// /// public static T GetRandomMember(this List @this) { var random = new Random(); return @this[random.Next(0, @this.Count - 1)]; }

    推荐阅读