0

好的,所以目标是每行/行生成 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 个唯一数字,并比较它们中的任何一个是否匹配不同的集合(每行/集合 >.<)

4

4 回答 4

7

您可以将随机整数填充到 aSet<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

于 2013-07-08T18:14:04.117 回答
3

使用允许您检查是否int已创建的数据类型。例如,将它们添加到ArrayList<Integer>.

ArrayList<Integer> numbers = new ArrayList<Integer>();
while(numbers.size() < 6) {
    int num = rand.nextInt(50) + 1;
    if(!numbers.contains(num)) {
        numbers.add(num);
    }
}

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

于 2013-07-08T18:12:42.723 回答
0

保存排序列表或更有效地保存一组先前选择的值,并检查您当前的选择与先前的选择,如果以前选择过,请重试。

于 2013-07-08T18:14:29.490 回答
0

如果您知道随机数的有效范围,并且该范围的大小不是令人望而却步,那么一种简单的算法如下:

  • 创建一个大小等于您的数字范围的数组
  • 用您的数字范围内的数字连续填充您的数组
  • 任意多次遍历列表;生成数组索引内的两个伪随机数,并在这些索引处交换两个元素

迭代完成后,您将拥有一个唯一表示的数字数组,这些数字都在您的数字范围内,以随机顺序出现。这几乎完全模拟了洗牌时发生的情况。

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

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

于 2013-07-08T18:35:01.490 回答