为什么不创建多组随机数?

时间:2013-07-08 18:10:45

标签: 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循环之外,所以只做了1组随机数)现在修好了。下一个挑战;具有比较程序以扫描90多组6个唯一数字,并比较它们中的任何一个是否匹配不同的组(每行/组&gt;。&lt;)

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分: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在评论中所说,您可以使用Set<Integer>并完全避免if()条件循环。但是我认为对于不知道Set API不会添加重复元素的初学者来说这会更直观。

答案 2 :(得分:0)

保存已排序的列表或更有效地保存一组先前选择的值,并检查当前选择是否与先前的选择相比,如果先前已再次选择,则再次尝试。

答案 3 :(得分:0)

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

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

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

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

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