If the number range is 0 - 10. I would like to generate the following numbers
e.g.
unique 5 numbers [3, 8, 5, 1, 9]
unique 3 numbers [2, 6, 5]
5 numbers of which 2 numbers occur twice [2, 3, 2, 6, 3]
7 numbers of which 2 numbers occur twice [2, 5, 9, 2, 7, 5, 3] (Here 2, 5 occur twice)
5 numbers of which 1 number occur thrice [2, 3, 8, 3, 3] (Here 3 occurs twice)
7 numbers of which 1 number occur thrice and 1 number occurs twice [1, 5, 9, 1, 1, 5, 3] (Here 1 occurs thrice, 5 occurs twice)
如何实现符合上述要求的通用功能。
EDIT1:
这就是我现在所拥有的......
protected List<Integer> fetchOverlapIntegers(int min, int max,
int howMany, int overlap) {
// The following code fetches unique numbers within the range
List<Integer> numbers = this.fetchRandomIntegers(min, max, howMany);
if (overlap > 0) {
int size = numbers.size();
for (int i = 0; i < overlap; i++) {
numbers.set(size - 1 - i, numbers.get(i));
}
}
Collections.shuffle(numbers);
return numbers;
}
答案 0 :(得分:1)
只是为了笑容,我为这个非常不明确的问题写了这个:
public static List<Integer> weirdFunction(List<Integer> criteria, List<Integer> candidateNumbers) {
List<Integer> results = new ArrayList<Integer>();
for (int occurrenceCount = 0; occurrenceCount < criteria.size(); occurrenceCount++) {
int thisMany = criteria.get(occurrenceCount);
for (int i=0; i < thisMany; i++) {
Integer theChoice = candidateNumbers.get(new Random().nextInt(candidateNumbers.size()));
for (int ct=0; ct < occurrenceCount; ct++) {
results.add(theChoice);
}
}
}
Collections.shuffle(results);
return results;
}
它需要两个列表,一个是criteria
,它基本上是一个列表,列出了在结果中放置一个随机选择的数字的次数(第一个选择一次,第二个选择两次,等等。),以及从中选择candidateNumbers
的列表。
但是,这种方式只允许您为每个条件指定一个特定的“计数”。例如你不能有一个“两个数字出现两次”的列表,因为“出现两次”只有一个插槽。您可以将其列为列表或其他一些数据结构。
此外,它在删除时不会消除重复项。因此,如果我们有一个criteria
{1, 1, 1}
,它会尝试拉一个数字,一个数字两次,一个数字三次。但是它没有检查这些数字是否相同 - 所以它最终可能每次都拉出相同的数字并有效地拉出一个数字六次,而不是一次,两次和三次单独的数字。
答案 1 :(得分:0)
您可以从竞争者值列表中随机提取项目,例如:
List<int> numbers = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Random r = new Random();
for (int i = 0; i < 4; i++)
{
int index = r.Next() % numbers.Count;
Console.WriteLine(numbers[index]);
numbers.RemoveAt(index);
}
如果你想要一个三倍的值,只需将第一个删除三倍。然后在结束时洗牌。