在Java中生成的随机数,其中没有任何数字0

时间:2018-10-31 15:42:20

标签: java random

我必须生成5位数的随机数,其中不能包含任何零。我尝试使用下面的代码,有时它可以工作,有时却不能。有更好的方法吗?

        public  Integer generateLastFiveSequenceNumbers()
        {
            Random ranndomNumber = new Random();
            Random replaceNumber = new Random();

            Integer fiveDigitRanndomNumber = 11111 + ranndomNumber.nextInt(99999);
            Integer replaceZeroNumber = 1 + replaceNumber.nextInt(9);


            String tempValidation = fiveDigitRanndomNumber.toString();
            char[] ch = tempValidation.toCharArray();

            for(int i = 0 ; i < ch.length-1 ;i++)
            {
                if(ch[i]=='0')
                {
                    ch[i] = '1'; 

                }
            }

            String newValue = new String(ch);
            Integer finalNumber = Integer.parseInt(newValue);
            return finalNumber;
        }

5 个答案:

答案 0 :(得分:1)

从理论上讲,用额外的随机数替换零位的预期方法是合理的,但您并没有在任何地方使用替换位。您的最终验证将遍历除最后一个索引之外的所有索引,该错误有时会导致出现零。用零代替全零会破坏很多随机性,因为现在出现的可能性是任何其他数字的两倍。

一个更简单的解决方案可能是连接五个随机数字,这些数字必须保证在开始时处于有效范围内。由于您的返回值是一个数字,因此您根本不需要处理字符串:

public  Integer generateLastFiveSequenceNumbers()
{
    Random ranndomNumber = new Random();
    int result = 0;
    for(int i = 0; i < 5; i++) {
        result = result * 10 + (randomNumber.nextInt(9) + 1);
    }
    return result;
}

答案 1 :(得分:0)

您的上面带有int流的想法:

    public static int generateLastFiveSequenceNumbers( ) {
        Random r = new Random();
        return r.ints(11111, 99999+1)
                .filter(i->!String.valueOf(i).contains("0"))
                .limit(1).findFirst().getAsInt(); 
    }

答案 2 :(得分:0)

以上答案的组合:

Integer rand = Integer.valueOf(
  IntStream.rangeClosed(1,5)  // repeat 5 times.
      .map(x -> { return new Random().nextInt(9) + 1;}  // Random between 1 and 9.
      .boxed()                         // Convert to a stream of Integer objects.
      .map(String::valueOf)               // Convert from Integer to String.
      .collect(Collectors.joining()));       // Concat them all together.

System.out.println(rand);

答案 3 :(得分:-1)

public static void generateRandom(int howMany) {
    int c = 0;
    int multiplicator = 1;
    Integer number = 0;
    while (c < howMany) {
        number += multiplicator * getRandom();
        multiplicator = multiplicator * 10;
        c++;
    }
    System.out.println(number);
}
public static Integer getRandom() {
    Random rand = new Random();
    return rand.nextInt(9)+1;
}

答案 4 :(得分:-1)

此解决方案使用BiFunction(仅Java 8)。

BiFunction<Integer,Integer,Integer> customRandom = (min,max) -> {
    int val = 0;
    Random r = new Random();
    do {
        val = min + r.nextInt(max);
    } while (String.valueOf(val).contains("0")); // skip randoms containing '0'
    return val;
}

用法:

System.out.println(customRandom.apply(10000,99999));