我试图让一小段java代码以随机顺序吐出数字1-6而不重复。我已经设法让它在一到六之间吐出六个随机整数,但它只检查一个数字是否被使用过一次。这是代码:
import java.util.Random;
public class kirbyInt
{
public static void main(String[] args)
{
int num1, num2, num3, num4, num5, num6;
Random rand = new Random();
num1 = rand.nextInt((6-1) + 1) + 1;
System.out.println(num1);
num2 = rand.nextInt((6-1) + 1) + 1;
if (num2 == num1)
{
num2 = rand.nextInt((6-1) + 1) + 1;
System.out.println(num2);
}
else
{
System.out.println(num2);
}
num3 = rand.nextInt((6-1) + 1) + 1;
if (num3 == num1 || num3 == num2)
{
num3 = rand.nextInt((6-1) + 1) + 1;
System.out.println(num3);
}
else
{
System.out.println(num3);
}
num4 = rand.nextInt((6-1) + 1) + 1;
if (num4 == num1 || num4 == num2 || num4 == num3)
{
num4 = rand.nextInt((6-1) + 1) + 1;
System.out.println(num4);
}
else
{
System.out.println(num4);
}
num5 = rand.nextInt((6-1) + 1) + 1;
if (num5 == num1 || num5 == num2 || num5 == num3 || num5 == num4)
{
num5 = rand.nextInt((6-1) + 1) + 1;
System.out.println(num5);
}
else
{
System.out.println(num5);
}
num6 = rand.nextInt((6-1) + 1) + 1;
if (num6 == num1 || num6 == num2 || num6 == num3 || num6 == num4 || num6 == num5)
{
num6 = rand.nextInt((6-1) + 1) + 1;
System.out.println(num6);
}
else
{
System.out.println(num6);
}
}
}
答案 0 :(得分:1)
您可以将数字放在ArrayList中。然后得到0-5之间的随机数并打印,然后从ArrayList中删除该位置的数字。这将只留下5个数字,得到0-4之间的下一个随机数,打印并删除该随机索引处的数字,依此类推,直到你只有一个并打印出那个。
答案 1 :(得分:1)
有一种更简单的方法可以解决这个问题。让我们重申你想要做的事情。
您想要创建n
个随机数,其中给定数字k
不在之前的k-1
数字中
创建一个用于保留随机数的Set
,当您创建一个新的时,将其添加到该集中,当且仅当它不在Set
中时,否则生成一个新的随机数,重复。
import java.lang.String;
import java.util.Random;
import java.util.Set;
import java.util.HashSet;
public class RandomNum {
public static final void main(String[] args){
final Random r = new Random();
final Set<Integer> s = new HashSet<>();
for(int i = 0; i < 6; i++){
while(true) {
int num = r.nextInt(6) + 1;
if (s.contains(num) == false) {
s.add(num);
System.out.println(num);
break;
}
}
}
}
}
/tmp$ javac RandomNum.java
/tmp$ java RandomNum
5
1
3
2
4
6
原则上,您可以使用其他数据结构来保存生成的随机数,例如List
。 Set
具有相对快速搜索的优点,以防您想要生成超过6个值。您可以使用ArrayList
获得类似的效果。然而,Set
的使用有一个更重要的优点,它反映了你想要的语义(一个无序的非重复值集)。您不关心集合中的排序,而不需要重复值。 List
是有序的值集合,Set
是一组无序值(意味着元素不能在Set
中重复,并且它们彼此之间没有关系关于它们被添加到Set
的时间。在编码时,几乎总是选择不仅工作的数据结构,而是反映你的意思的语义。< / p>
答案 2 :(得分:0)
小问题:为什么要rand.nextInt((6-1) + 1)
代替rand.nextInt(6)
?
现在,关于手头的任务:我想从可能的数字列表开始;随机选择列表中的一个现有索引(结果是该索引处的数字);从列表中删除该号码。当列表为空时,您不能再使用数字。
关于该解决方案的好处是,您不必重复尝试多次生成随机数,直到找到尚未使用的随机数。
例子代码:
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Main {
public static void main(String[] args) {
final List<Integer> integers = new ArrayList<>();
final Random rand = new Random();
// Fill list
for (int i = 1; i <= 6; i++) {
integers.add(i);
}
// Take numbers in random order
while (!integers.isEmpty()) {
final int index;
if (integers.size() > 1) {
index = rand.nextInt(integers.size() - 1);
} else {
// rand.nextInt(0) would throw an exception rather than return 0
index = 0;
}
final int result = integers.remove(index);
System.out.println("Result: " + result);
}
}
}
答案 3 :(得分:0)
你可以这样做
public class NonRepreatedRandomNumbers {
public static void main(String[] args) {
ArrayList myList = new ArrayList();
Random rd = new Random();
int num;
while(true){
num = rd.nextInt(6) + 1;
if(myList.size() == 6)
break;
if(!myList.contains(num)){
myList.add(num);
System.out.println(myList);
}else
continue;
}
}
}