首页 > 解决方案 > java中没有重复的随机数

问题描述

我喜欢它:

    int randOne = 3;
    int randTwo = 4;
    int oneNubmer;
    int twoNumber;

    do {
         oneNubmer = 1 + (int) (Math.random() * randOne);
         twoNumber = 1 + (int) (Math.random() * randTwo);
    } while (oneNubmer == twoNumber);

它可以工作,但大大增加了操作时间,因为这个函数被调用了 1000+ 次。

如何做得更好?

标签: javarandom

解决方案


一旦你对生成的数字施加某些规则(例如它们不能重复),你就不能再认为它们是随机的了。

您可以考虑将 oneNumber 添加到 twoNumber(或在计算 twoNumber 时使用 oneNumber 的任何其他操作),这样它们就永远不会相等。尽管这再次强加了 twoNumber 总是高于 oneNumber 的事实,因此可以再次被视为对“随机”概念的破坏。

oneNumber = 1 + (int) (Math.random() * randOne);
twoNumber = 1 + oneNumber + (int) (Math.random() * randTwo);

对于您想要生成 1-4 之间的第一个数字和 1-5 之间的第二个数字而不重复的要求,您可以使用以下方法:

// Create a list containing numbers 1 till 5
List<Integer> numbers = new ArrayList<Integer>();
for(int i = 1; i < 6; i++) {
  numbers.add(i);
}

Random random = new Random();

// Randomly get the index of your first number, this will be a number 
// between 1 and 4
int firstIndex = random.nextInt(4);
int number1 = numbers.get(firstIndex);

// Remove that number from the list, your list now becomes size 4, and no 
// longer contains the first number you picked.
numbers.remove(firstIndex);

// Randomly get the index of your second number, this will be a number 
// between 1 and 5 without the number picked earlier.
int secondIndex = random.nextInt(4);
int number2 = numbers.get(secondIndex);

System.out.println(number1);
System.out.println(number2);

或者也许更干净,更快:

// Create a list containing numbers 1 till 5 -> might want to extract this
// from the method so you don't have to rebuild the array over and over 
// again each call...
List<Integer> numbers = new ArrayList<Integer>();
for(int i = 1; i < 6; i++) {
  numbers.add(i);
}

// Shuffle the array randomly
Collections.shuffle(numbers);

// Get the first 2 numbers from the array
int number1 = numbers.get(0);
int number2 = numbers.get(1);

// If number1 equals 5, swap number1 and number2 as you want number1 to be 
// 1-4 and number2 to be 1-5
if(number1 == 5) {
  number1 = number2;
  number2 = 5;
}

System.out.println(number1);
System.out.println(number2);

推荐阅读