我必须生成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;
}
答案 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));