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

}

}

编辑非常感谢大家,我终于到了那里,结果发现我把数组放在了错误的位置(它在for循环之外,所以只生成了一组随机数)现在修复了它。下一个挑战;有一个比较程序来扫描 90 多个组(每组 6 个唯一数字),并比较其中任何一个是否与不同的组匹配(每行/组 >.<)

最佳答案

您可以将随机整数填充到 Set<Integer> 中直到它有六个元素:

Set<Integer> randomNumbers = new HashSet<>();
Random rand = new Random();
while (randomNumbers.size() < 6) {
    randomNumbers.add(rand.nextInt(50) + 1);
}

或者,您可以生成数字 1-50,将它们打乱,然后选择任意六个元素:

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

第一个解决方案在发生碰撞时会做额外的工作;所需的数量与总数的比率越大,这项额外的工作就会增加。第二个需要处理所有 50 个数字,因此需要做额外的工作;所需的数量与总数的比率越大,额外的工作就越少。这是一个有趣的问题,交叉点在哪里。

编辑(回应对原始问题的编辑)使用上述方法之一生成六个不同的随机数后,您需要将它们放入您要使用的变量中。一种方法(比如使用第一种方法)如下:

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

numbers数组替换您的变量 number1 , ..., number6 .

关于java - 为什么这不会创建多组随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17533233/

相关文章:

java - Selenium Chrome 错误 : You are using an unsupported command-line flag: --ignore-certifcate-errors

java - Selenium webdriver Java 代码使用 web 驱动程序双击网格中的记录

java - 如何使用正则表达式验证字符串 key=value 格式?

java - Android apk 编译构建后如何添加资源文件?

java - 添加 try..catch 时为 "input cannot be resolved"

java - 将 "private"添加到枚举字段会更改静态上下文

java - ElasticSearch 索引问题 TransportSerializationException

java - 在 Tomcat 6.0 上加载持久 session 时出现 IOException

java - 测试Web层时模拟 Controller 类的方法

Java oop设计验证