Java 为什么赢了';这难道不能创建多组随机数吗?

Java 为什么赢了';这难道不能创建多组随机数吗?,java,Java,目标是每行生成6个随机数。行数为x(由用户通过UserInput设置)。每行必须有唯一的编号(非重复编号)。我很确定这些数字是唯一的,但是我似乎不能让它有多行,而且我也不知道是什么部分阻止了多行 package rtg; import java.util.Arrays; import java.util.HashSet; import java.util.Random; import java.util.Set; public class Array { public static voi

目标是每行生成6个随机数。行数为x(由用户通过UserInput设置)。每行必须有唯一的编号(非重复编号)。我很确定这些数字是唯一的,但是我似乎不能让它有多行,而且我也不知道是什么部分阻止了多行

package rtg;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;

public class Array {

public static void main(String[] args) {

    String name;
    int noTickets;
    int[] numbers = new int[6];
    Set<Integer> randomNumbers = new HashSet<>();
    Random rand = new Random();



    int ticketCount = 1;



    System.out.println("Please input your name");
    name = UserInput.readString();
    System.out.println("Please input the number of tickets you want");
    noTickets = UserInput.readInt();
    System.out.println("___________________________________________\n___________________________________________");
    System.out.println("___________________________________________\n___________________________________________");


    System.out.println("Name: " +name+ "\nNumber of Tickets: " +noTickets+ "\nNumbers: ");

    for (ticketCount = 1; ticketCount <= noTickets; ++ticketCount){

        while (randomNumbers.size() < 6) {
            randomNumbers.add(rand.nextInt(50) + 1);
        }

        int i = 0;
        for (Integer n : randomNumbers) {
            numbers[i++] = n;
        }   



        System.out.print( Arrays.toString(numbers) + "\n");
    }

}
packagertg;
导入java.util.array;
导入java.util.HashSet;
导入java.util.Random;
导入java.util.Set;
公共类数组{
公共静态void main(字符串[]args){
字符串名;
国际通告;
int[]数字=新的int[6];
Set randomNumbers=新HashSet();
Random rand=新的Random();
int ticketCount=1;
System.out.println(“请输入您的姓名”);
name=UserInput.readString();
System.out.println(“请输入您想要的票数”);
noticets=UserInput.readInt();
系统.out.println(“uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;
系统.out.println(“uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;
System.out.println(“名称:“+Name+”\n票证编号:“+noticets+”\n编号:”);

对于(ticketCount=1;ticketCount.使用允许您检查
int
是否已创建的数据类型。例如,将它们添加到
ArrayList

ArrayList number=new ArrayList();
while(number.size()<6){
int num=rand.nextInt(50)+1;
如果(!numbers.contains(num)){
数字。添加(num);
}
}

当然,正如@sanbhat在评论中所说的,您可以使用
Set
并避免使用
if()
条件完全在循环中。但是我认为这对于初学者来说更直观,因为他们不知道
Set
API不会添加重复元素。

您可以将随机整数填充到
集合中,直到它有六个元素:

Set<Integer> randomNumbers = new HashSet<>();
Random rand = new Random();
while (randomNumbers.size() < 6) {
    randomNumbers.add(rand.nextInt(50) + 1);
}
List<Integer> numbers = new ArrayList<>(50); // known capacity
for (int i = 1; i <= 50; ++i) { numbers.add(i); }
Collections.shuffle(numbers);
List<Integer> sixRandomNumbers = numbers.subList(0, 6);
Set randomNumbers=new HashSet();
Random rand=新的Random();
while(randomNumbers.size()<6){
随机数。加上(兰特。耐克斯汀(50)+1);
}
或者,您可以生成数字1-50,将其洗牌,然后选择任意六个元素:

Set<Integer> randomNumbers = new HashSet<>();
Random rand = new Random();
while (randomNumbers.size() < 6) {
    randomNumbers.add(rand.nextInt(50) + 1);
}
List<Integer> numbers = new ArrayList<>(50); // known capacity
for (int i = 1; i <= 50; ++i) { numbers.add(i); }
Collections.shuffle(numbers);
List<Integer> sixRandomNumbers = numbers.subList(0, 6);
List number=new ArrayList(50);//已知容量

对于(int i=1;i保存一个排序列表或更有效地保存一组以前选择的值,并对照以前选择的值检查当前选择,如果以前选择了,请重试。

如果您知道随机数的有效范围,并且该范围的大小不是禁止的,一个简单的算法如下:

int[] numbers = new int[6];
Set<Integer> randomNumbers = new HashSet<>();
Random rand = new Random();
while (randomNumbers.size() < 6) {
    randomNumbers.add(rand.nextInt(50) + 1);
}
System.out.println("Six random numbers: " + randomNumbers.toString());

// if you need them as an `int` array:
int i = 0;
for (Integer n : randomNumbers) {
    numbers[i++] = n;
}
  • 创建一个大小等于数字范围的数组
  • 用数字范围内的数字连续填充数组
  • 遍历列表任意多次;生成数组索引中的两个伪随机数,并在这些索引处交换这两个元素
迭代完成后,您将拥有一组唯一表示的数字,这些数字都在您的数字范围内,以随机顺序出现。这几乎完全模拟了洗牌时发生的情况

然后,您可以编写一个简单的方法,在每次调用数组时连续地从数组中弹出数字


此算法的一个优点是,它可以实现为一个原语数组,例如int[],而不需要Java Collections API。

相反,您可以使用
Set
这正是我要建议的解决方案!Josh,请注意,一旦您遵循了这一点(正确)解决方案,您必须记住列表中包含的是
Integer
s,而不是
int
s。这会有所不同!@RussellUhl由于自动取消装箱等原因,可能不会有太大的不同。@JeffGohlke我的意思是,如果他在某个时候想要比较这些值,因为(如果我回忆正确-我的信息可能已过时或完全错误)整数不能直接与整数类型进行比较,因为整数是一个对象,而整数不是。对吗?@RussellUhl实际上,你可以将
整数
整数
进行比较。但是在将
整数
与其他
整数
进行比较时,你提出了一个很好的观点。谢谢。我认为这已经对它进行了排序(我会再做一些检查,但到目前为止没有重复的)。只是一个简单的请求,是否可以解释Set和HashSet的实际用途?(我想知道,以供将来参考:)另外,稍微不同的问题,但相关的,如果我手动输入一系列6个数字(也有多行)是否可以使用这种方法,检查是否有任何数字与另一个列表匹配?(即我在一行中输入10、9、8、7、6、5,在另一行中输入1、2、3、4、5、6,并想检查是否有任何数字与10、4、30、12、41、9等匹配。)呃……不起作用。出于兴趣,我应该将此代码放在哪里(我用字符串变量'name')@Josh-什么不起作用?(如果有必要,你可以编辑你的问题并将修改后的代码发布在原始帖子下方,以解释仍然错误的地方。)关于你的第二个查询——我建议将其作为一个新问题发布。@Josh——你可以将我建议的代码放在一个返回
集合的方法中。然后在需要六个随机整数时调用该方法。(如果您要多次使用它,您可能希望将
随机
作为一个类字段,而不是在每次调用时创建一个新字段。)@Josh-我看到您仍在通过
数字6
以旧方式生成
数字1
。您应该用从集合中取出六个数字来替换它。(您可以迭代集合以依次获得每个元素。)