如何在一定范围内自动生成重叠整数

时间:2010-12-08 05:39:14

标签: java

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

2 个答案:

答案 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);
}

如果你想要一个三倍的值,只需将第一个删除三倍。然后在结束时洗牌。