【发布时间】:2017-03-12 11:34:41
【问题描述】:
我正在寻找一种 C# 算法,它会从输入 List 中给我一组随机整数,这样获得的随机整数之和为 N。
例如: 如果列表是 {1,2,3,4,5,6...100} 并且 N 是 20,那么算法应该返回一组随机数,例如 {5,6,9} 或 {9,11}或 {1,2,3,4,10} 等。
请注意,结果集中的整数计数不需要固定。此外,输入列表可以有重复的整数。性能是我的首要任务之一,因为输入列表可能很大(大约 1000 个整数),我需要在单个 Web 请求中随机化大约 2-3 次。如果列表存在性能问题,我可以灵活地不坚持将列表作为数据类型。
我尝试了以下非常初级且性能低下的方法:
- 使用 Random 类从输入列表中获取随机索引
- 从输入列表中获取整数,该列表位于 #1 中获得的索引处。让我们将此整数称为 X。
- 总和 = 总和 + X。
- 从输入列表中删除 X,使其不会被下一步选中。
- 如果 Sum 小于所需的总 N,则将 X 添加到 outputList 并返回到 #1。
- 如果 Sum 大于所需的总 N,请重新初始化所有内容并重新启动该过程。
-
如果 Sum 等于所需的总 N,则返回 outputList
while(!reachedTotal) { //Initialize everything inputList.AddRange(originalInputList); outputList = new List<int>(); while (!reachedTotal) { random = r.Next(inputList.Count); sum += inputList.ElementAt(random); if(sum<N) { outputList.Add(inputList.ElementAt(random)); inputList.RemoveAt(random); } else if(sum>N) break; else reachedTotal = true; } }
【问题讨论】:
-
为什么只描述你使用的代码。也发一下...
-
这个列表是任意的还是你知道它的一些特征(例如由连续的数字组成)?如果它是任意的,那么问题是子集和的变体,它是 NP 完全的。
-
是否保证存在解决方案?
-
@NicoSchertler - 该列表是任意的。
-
@Benj 解决方案无法保证。但我可以接受总 N 的 10% 差异。
标签: c# algorithm list random sum