我们说我有一个预定义数字列表,以及一个预定义最大限制列表。
当用户选择限制时,我需要从第一个列表中随机选择一定数量的数字,直到它们的总数匹配(尽可能接近但从未结束)用户选择的总数。
到目前为止我已尝试过:
void Main()
{
List<int> num = new List<int>(){ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,17, 18, 19, 20 };
int maxNum = 17;
List<int> curNum = new List<int>();
int curTotal = 0;
foreach(int sel in num.Where(x => x < maxNum)){
curTotal += sel;
if(curTotal <= maxNum){
curNum.Add(sel);
}
}
}
需要挑选x
个数字。在这种情况下,挑选5个数字,+ - 20个数字随机挑选,1个最大值。
所以结束列表应如下所示:
1, 2, 3, 4, 7 (17)
1, 2, 3, 5, 6 (17)
1, 2, 3, 4, 6 (16)
&lt; - 如果没有最大值的解决方案,这将没有问题。
答案 0 :(得分:0)
我认为shuffle +“占用而且&lt; limit”可能正是您所寻找的。 p>
如下所示:
var shuffledList = num.ToList();
shuffledList.Shuffle();
var sum = 0;
var count = 0;
while (shuffledList[count] + sum < max)
{
sum += shuffledList[count++];
}
return shuffledList.Take(count);
答案 1 :(得分:0)
以@ AlexiLevenkov的回答为基础:
课程计划 { static void Main(string [] args) { int limit = 17; int listSize = 5;
List<int> a = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
a.Shuffle();
List<int> genList = new List<int>();
int stoppedCount = 0;
for (int i = 0; i < a.Count(); i++)
{
if (i < listSize)
{
genList.Add(a[i]);
stoppedCount = i;
}
else
{
break;
}
}
while (genList.Sum() > limit)
{
genList.Remove(genList.Max());
stoppedCount++;
genList.Add(a[stoppedCount]);
}
}
}
static class ThisClass
{
public static void Shuffle<T>(this IList<T> list)
{
Random rng = new Random();
int n = list.Count;
while (n > 1)
{
n--;
int k = rng.Next(n + 1);
T value = list[k];
list[k] = list[n];
list[n] = value;
}
}
}