生成10位数的所有组合,无需重复

时间:2013-05-04 15:14:36

标签: java random

我正在通过Java创建密码:

  

假设您在安全销售公司工作,并且您的经理要求您创建一个包含0000000000和9999999999之间所有十位数字的列表,而不重复相同数字的数字。在JAVA中执行此算法的方法是什么?

这是我到目前为止所做的:

public static long generateNumber()  
{  
    String s1 = "33333";  
    double d = Math.random();  
    d=d*100000.0;  
    int i = (int) d;  
    String s2 = String.valueOf(i);  
    String s3=s1+s2;  
    long m = Long.parseLong(s3);  
    return m;
}

3 个答案:

答案 0 :(得分:4)

如果您正在寻找没有任何重复数字的十位数字,那么您实际上是在生成所有数字的所有排列,即字符串"0123456789"

SO上有其他线程可以帮助您解决此问题,例如这些

答案 1 :(得分:1)

使用少量代码的简单方法是:

List<Long> combos = new ArrayList<>();
Set<Character> chars = new HashSet<>();
for (long i = 1000000000; i < 9999999999L; i++) {
    chars.clear();
    for (char c : String.valueOf(i).toCharArray()) {
        chars.add(c);
    }
    if ((chars).size() == 10) {
        combos.add(i);
    }
}

效率不高,但能胜任。

答案 2 :(得分:0)

使用改组技术:

    public static void main(String[] args) {
        List<Integer> passwords = Arrays.asList( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 );
        for (int i = 0; i < 10; i ++)
        {
            Collections.shuffle(passwords);
            String p = toFlatString(passwords);
            System.out.println(p);
        }
    }

    private static String toFlatString(List<Integer> list) {
        StringBuilder sb = new StringBuilder();
        for (int i : list)
            sb.append(i);
        return sb.toString();
    }

<强>输出: 2651803497 2936745018 7064918235 1594670823 4035872619 6432971850 6387925401 7103649285 9712380645 9321574806