public class random {
public static void main(String[] args) {
long intArray[] = new long[20]; // to generate more than 20 random numbers increase this and the 'i < 20' to the same number ie. 75
for(int i = 0; i < 20; i++) { // here
intArray[i] = numbGen();
}
for(int j = 0; j < intArray.length; j++) {
System.out.println(intArray[j]);
}
}
public static long numbGen() {
long numb = (long)(Math.random() * 10000000 * 1000000); // had to use this as int's are to small for a 13 digit number.
return numb;
}
}
我的问题现在有时它会在20组中产生几个12位数字,我想找到一种方法,如果它不是13位,就不要将数字添加到数组中。我已经尝试过声明,但却因为无法确定Long的长度(个别字符)而感到困惑。
先谢谢。
答案 0 :(得分:4)
一个简单的解决方案:
while(test < 10000) {
long num = (long) (Math.random() * 100000000 * 1000000);
if(Long.toString(num).length() == 13) {
return num;
}
test++;
}
然而,更好的解决方案是:
long number = (long) Math.floor(Math.random() * 9000000000000L) + 1000000000000L;
这只会生成随机的13位数字,您无需检查是否有更多或更少的数字。
请注意,此解决方案可能无法扩展到更高的位数,并且可能无法返回随机数的完美分布。
答案 1 :(得分:2)
long min = 1000000000000L; //13 digits inclusive
long max = 10000000000000L; //14 digits exclusive
Random random = new Random()
long number = min+((long)(random.nextDouble()*(max-min)));
答案 2 :(得分:2)
基于通用整数的实现将是:
public static long randomDigits(int digits) {
if (digits <= 0 || digits > 18) {
throw new IllegalArgumentException("A long can store the random of 18 full digits, you required: " + digits);
}
// use SecureRandom instead for truly random values
final Random r = new Random();
long randomNumber = r.nextInt(9) + 1;
for (int i = 1; i < digits; i++) {
randomNumber = randomNumber * 10L + (long) r.nextInt(10);
}
return randomNumber;
}
或使用13个数字的较短版本,不会对RNG征税:
public static long thirteenRandomDigits() {
final Random r = new Random();
return 1_000_000_000L * (r.nextInt(9_000) + 1_000)
+ r.nextInt(1_000_000_000);
}
这些解决方案更适合使用Math.random()
,因为它们不依赖于大数乘法来生成随机值。双精度只有15-17位精度,非常接近它乘以的13位数。这导致随机数的不均匀分布。基于Math.random()
的解决方案也不会超过13位。
答案 3 :(得分:1)
您所描述问题的简单解决方案:
public static long numbGen() {
while (true) {
long numb = (long)(Math.random() * 100000000 * 1000000); // had to use this as int's are to small for a 13 digit number.
if (String.valueOf(numb).length() == 13)
return numb;
}
}
这不是生成13位数字的最有效或最随机的实现,但它会回答您的特定问题。
答案 4 :(得分:0)
首先,Long没有字符。
如果您想查看它是否有13位数字,请将其与999999999999L进行比较。
如果您想确保您的值为13位数,请获取介于0和8999999999999L(含)之间的随机数(使用您已有的技术生成范围内的随机数)并将其添加到1000000000000L。
答案 5 :(得分:0)
long randomNumber = 0;
long power = 1;
for(int i = 0; i < 12; i++) { // up to 12 not 13
Random r = new Random();
int randomInt = r.nextInt(10);
randomNumber += (power * randomInt);
power *= 10;
}
// here, the most stupid way to provide last digit to be not zero
Random r = new Random();
int randomInt = r.nextInt(9);
randomInt++;
randomNumber += (power * randomInt);
power *= 10;
答案 6 :(得分:0)
ThreadLocalRandom是一件好事,在Java 1.7中引入
java.util.concurrent.ThreadLocalRandom
.current()
.nextLong(1000000000000L, 10000000000000L);
答案 7 :(得分:0)
为什么我们不尝试使用毫秒时间的Unix时间戳。因为这将在未来200年内有效,之后我们只需要从数字中删除尾随数字。
Calendar.getInstance().get(Calendar.MILLISECOND);
并且通过使用这种方法,我们不需要任何循环或任何条件,它每次都会给我一个唯一的数字。