Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中无重复的随机数_Java_Random - Fatal编程技术网

java中无重复的随机数

java中无重复的随机数,java,random,Java,Random,我很喜欢: 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);

我很喜欢:

    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多次


<> P> >一旦你对生成的数字加上一定的规则(例如,它们不能重复),你就不能再把它们看作随机的了。

你可以考虑将两个数加到两个数(或者在计算两个数时使用OnNoNobe的任何其他运算),这样它们就永远不会相等。尽管这再次强调了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);
//创建一个包含数字1到5的列表
列表编号=新的ArrayList();
对于(int i=1;i<6;i++){
增加(i);
}
随机=新随机();
//随机获取第一个数字的索引,这将是一个数字
//在1到4之间
int firstIndex=random.nextInt(4);
int number1=numbers.get(firstIndex);
//从列表中删除该数字,您的列表现在变为大小4,并且没有
//“更长”包含您拾取的第一个数字。
删除(第一个索引);
//随机获取第二个数字的索引,这将是一个数字
//介于1和5之间,没有先前拾取的数字。
int secondIndex=random.nextInt(4);
int number2=numbers.get(secondIndex);
系统输出打印项次(编号1);
系统输出打印项次(编号2);
或者更干净更快:

// 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);
//创建一个包含1到5个数字的列表->可能要提取该数字
//从方法开始,这样就不必反复重建数组
//每一次电话都是。。。
列表编号=新的ArrayList();
对于(int i=1;i<6;i++){
增加(i);
}
//随机洗牌数组
收藏。洗牌(数字);
//从数组中获取前2个数字
int number1=numbers.get(0);
int number2=numbers.get(1);
//如果number1等于5,则交换number1和number2,如您所愿
//1-4和数字2为1-5
如果(数字1==5){
编号1=编号2;
数字2=5;
}
系统输出打印项次(编号1);
系统输出打印项次(编号2);

注意:没有重复的随机数在所有情况下都不是真正的随机数,因为您可能必须放弃一个或多个绘图。@TimBiegeleisen Biegeleisen您有什么想法?也许您想要“唯一”数而不是“随机”数。检查
java.util.UUID
或者@Marteng是的,但是我需要从1到4和从1到5的唯一数字。谢谢,但是我,但是我需要从1到4的唯一数字作为第一个int,从1到5的唯一数字作为第二个int。同样,我也需要根据您的具体情况给出建议。问题是5比其他int更常见,但这是您特定需求的隐含结果。因为5只能作为第二个数字出现,而且永远不能复制到第一个数字,所以出现的频率会稍高一些。当然,您必须重新编写该部分,使其与您的新要求相匹配…:-)其基本思想是,通过上述方法,您可以在特定范围内拥有x个唯一的数字。如何处理、订购或进一步处理这些问题完全取决于您。