【问题标题】:Generating an array of random numbers without duplicates [duplicate]生成不重复的随机数数组[重复]
【发布时间】:2016-05-05 13:07:55
【问题描述】:

两天来我一直在努力确保随机生成器方法不会生成重复项。我只需要处理循环而不导入任何库。我已经找到了这个解决方案,从长远来看,这段代码会产生重​​复吗?如果是,请帮忙。

int[] vargu1 = new int[5];

for (int i = 0; i < vargu1.length; i++) {
    int numriSekret = (int) (Math.random() * 10) + 1;
    vargu1[i] = numriSekret;
}

System.out.println(vargu1[i]);
System.out.println();

for (int i = 0; i < vargu1.length; i++) {
    for (int j = 0; j < i; j++) {
        if (vargu1[i] == vargu1[j]) {
            vargu1[i]++;
        }
        System.out.println(vargu1[i]);
    }
}

【问题讨论】:

  • 如果它不能生成重复,它就不再是一个“随机生成器”,那么你到底想做什么?
  • @Stultuske 我正在努力确保随机方法不会给我两次相同的数字。
  • 如果你认为你需要“没有重复的随机数”,那么你就没有理解这个问题。你到底想完成什么?

标签: java random duplicates


【解决方案1】:

既然你说没有任何库,你可以为数组重新实现 Collections.shuffle(...) 方法。

int [] randoms = new int[5];

// creating an array containing the numbers 1-10
int [] shuffleArray = new int[10];
for (int i = 1; i <= 10; i++) {
    shuffleArray[i-1] = i;
}

// shuffling that array
Random random = new Random();
for (int i = 0; i < 10; i++) {
    int j = random.nextInt(10);
    int tmp = shuffleArray[i];
    shuffleArray[i] = shuffleArray[j];
    shuffleArray[j] = tmp;
}

// assigning the first 5 values to the random array
for (int i = 0; i < randoms.length; i++) {
    randoms[i] = shuffleArray[i];
}

虽然我不得不说Random 也需要导入(也需要库)

【讨论】:

    【解决方案2】:

    据我了解您在做什么,更好的方法是/可能是:

    List<Integer> myList = new ArrayList<Integer>();
    for ( int i = 0; i < expectedNumberOfUniques; i++){
      Integer a = generateRandom();
      while ( myList.contains(a)){
        a = generateRandom();
      }
      myList.add(a);
    }
    

    不过要注意几点:myList 中的元素越多,效率就越低。

    但是:一旦您将其限制为“不允许重复”,我们就不再谈论“随机”数字。

    【讨论】:

    • 我知道如果我限制它不会被称为随机,但我必须确保不会两次生成相同的数字。我必须在不导入任何库的情况下执行此操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 2012-01-23
    相关资源
    最近更新 更多