从数字列表中随机选择,直到达到特定限制

时间:2015-01-27 17:19:23

标签: c#

我们说我有一个预定义数字列表,以及一个预定义最大限制列表。

当用户选择限制时,我需要从第一个列表中随机选择一定数量的数字,直到它们的总数匹配(尽可能接近但从未结束)用户选择的总数。

到目前为止我已尝试过:

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; - 如果没有最大值的解决方案,这将没有问题。

2 个答案:

答案 0 :(得分:0)

我认为shuffle +“占用而且&lt; limit”可能正是您所寻找的。

如下所示:

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;
        }
    }
}