好的,所以目标是每行/每行生成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;)
答案 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。