使用Java创建一个四位数的随机数字,且数字中无重复数字。

8
我用Java编写了一段代码,用于生成不重复数字的四位随机数,下面是我编写的代码:
Random r = new Random();
d1 = r.nextInt(9);
d2 = r.nextInt(9);
d3 = r.nextInt(9);
d4 = r.nextInt(9);
while(d1==d2||d1==d3||d1==d4||d2==d3||d2==d4||d3==d4)
{
    if(d1==d2||d2==d3||d2==d4)
    {
        d2 = r.nextInt(9);
    }
    if(d1==d3||d2==d3||d3==d4)
    {
        d3 = r.nextInt(9);
    }
    if(d1==d4||d2==d4||d3==d4)
    {
        d4 = r.nextInt(9);
    }
}   
System.out.println(d1+""+d2+""+d3+""+d4);

以下是从System.out.println(R1+""+R2+""+R3+""+R4);生成的测试用例:
 0123 |  OK as required
 1234 |  OK as required
 2123 |  not OK because 2 is present more than one time 
 9870 |  OK as required
 0444 |  not OK because 4 is present more than one time

现在我的问题是,是否有更好的方法来完成这个任务?我能否以某种方式增强它?

3
我不确定这是否是最好的方法,但可以使用 Set<Integer> set = new LinkedHashSet<Integer>(); 并使用 while 循环,直到其大小为4(或所需大小),在循环内部继续添加随机整数。请注意,LinkedHashSet 可以保留输入顺序并消除重复项。 - Luiggi Mendoza
1
如果我算对了,那么可能有5040种组合。创建一个包含所有5040个值的数组,并使用随机数模5040从中选择。 - Hot Licks
1
生成一个介于0和5039之间的随机数。对于第一位数字,取模9;对于第二位数字,取模8;对于第三位数字,取模7等等。在获得这些数字后,递增列表中的任何重复项。 - Hot Licks
7个回答

18
创建一个从0到9的整数列表,将其随机排序并提取前4个。
public static void main(String[] args) {
    List<Integer> numbers = new ArrayList<>();
    for(int i = 0; i < 10; i++){
        numbers.add(i);
    }

    Collections.shuffle(numbers);

    String result = "";
    for(int i = 0; i < 4; i++){
        result += numbers.get(i).toString();
    }
    System.out.println(result);
}

有一些丑陋的字符串到整数的转换,但你可以理解这个想法。根据你的使用情况,你可以看到需要什么。


5

有几种方法:

  1. 使用Set来存储数字,不断添加随机数字直到集合中有四个值。

  2. 创建一个包含0-9值的数组。洗牌并取前四个值。

如果性能很重要,您需要尝试几种不同的方法并查看哪种更快。


4
以下是我的方法,虽然它使用了很多字符串解析但没有使用任何数据结构:
 static int generateNumber(int length){
            String result = "";
            int random;
            while(true){
                random  = (int) ((Math.random() * (10 )));
                if(result.length() == 0 && random == 0){//when parsed this insures that the number doesn't start with 0
                    random+=1;
                    result+=random;
                }
                else if(!result.contains(Integer.toString(random))){//if my result doesn't contain the new generated digit then I add it to the result
                    result+=Integer.toString(random);
                }
                if(result.length()>=length){//when i reach the number of digits desired i break out of the loop and return the final result
                    break;
                }
            }

            return Integer.parseInt(result);
        }

2
也许可以使用Set集合?
Random r = new Random();
Set<Integer> s = new HashSet<Integer>();
while (s.size() < 4) {
    s.add(r.nextInt(9));
}

1
大致意思(未经测试):
int randomNum = r.nextInt(5040);
int firstDigit = randomNum % 10;
randomNum = randomNum / 10;
int secondDigit = randomNum % 9;
randomNum = randomNum / 9;
int thirdDigit = randomNum % 8;
randomNum = randomNum / 8;
int fourthDigit = randomNum % 7;

if (secondDigit == firstDigit) {
  secondDigit++;
}

while ((thirdDigit == firstDigit) || (thirdDigit == secondDigit)) {
  thirdDigit++:
}

while ((fourthDigit == firstDigit) || (fourthDigit == secondDigit) || (fourthDigit == thirdDigit)) {
  fourthDigit++;
}

在编写代码后,我意识到增量操作需要进行模10运算。

1
创建一个包含0到9整数的列表(总共10个项目)。
List<Integer> l = ...
Collections.shuffle(l);
d1 = l.get(0);
d2 = l.get(1);
d3 = l.get(2);
d4 = l.get(3);

1

以下是我的解决方案,没有使用任何额外的数据结构,在生成随机数字时循环直到它具有唯一的数字。

int a = 0, b = 0, c = 0, d = 0;
int x = 0;
while (true) {
    x = r.nextInt(9000) + 1000;
    a = x % 10;
    b = (x / 10) % 10;
    c = (x / 100) % 10;
    d = x / 1000;
    if (a == b || a == c || a == d || b == c || b == d || c == d)
        continue;
    else
        break;
}

System.out.println(x);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接