java公交车随机数_11 Java中的数字随机数

我必须生成一个11位的ID号,但是当我使用随机包时,它表示它超出范围,那么我如何才能使它成为11位呢?

public static int generateID(){

Random r = new Random();

int numbers = 1000000000 + (int)(r.nextDouble() * 999999999);

return numbers;

}

int不能比int大,用long代替int

Java的可能复制:随机长数在0

import java.util.concurrent.ThreadLocalRandom;

...

public long generateId() {

ThreadLocalRandom random = ThreadLocalRandom.current();

return random.nextLong(10_000_000_000L, 100_000_000_000L);

}

使用正确的工具。本案例中,Random是小于ThreadLocalRandom值得多。

你想知道为什么他们从来没有在Random中添加额外的方法来保持一致。他们似乎认为Random已经过时了,也就是说,如果不把它真正标记为过时的话,就不必费心跟上时代。他们在想什么???????

@安德烈亚斯是的,我仍然想知道为什么他们没有重写Random来使用相同的方法。这完全是错误的…

除此之外,我如何编写一个代码,使每个ID号都是唯一的

@ekin唯一的方法是将所有的ID放在一个Set中,并检查该集合中是否包含一个ID。

我们有没有可能把它放在for循环或其他什么东西上而不是设置

确保均匀分布nextInt(int bound),你应该使用的方法。

因为它无法产生11位数字的能力超出了int),你需要调用它的负载,例如把9位(000000000 999999999 - 2),和第一位(10~99)。

记得使用长的地方,以防止int溢出。

long numbers = r.nextInt(1_000_000_000)               // Last 9 digits

+ (r.nextInt(90) + 10) * 1_000_000_000L; // First 2 digits

最后是一个很有意义的答案,可以使用所有人都能使用的工具。使用double显然是错误的!

最大的价值是一个Java 2147483647。十位数字与9,除非你只知道它下面这样的价值。

有一些的方式来处理这将是最简单的,但使用datatype长"而"int"。最大值ALONG是19位,他们支持你的用例。

在这里:

int numbers = 1000000000 + (int)(r.nextDouble() * 999999999);

一个8位的数r.nextDouble() * 999999999副车架。这是additioning 1000000000包含10位到8位号码,不包含,包含一个11位的产生。

此外,11位的要求a long需要intAS Integer.MAX_VALUE= = 2147483647(10位)。

Get a 11位数字的号码,你可以做的:

long n = 10000000000L + ((long)rnd.nextInt(900000000)*100) + rnd.nextInt(100);

((long)rnd.nextInt(900000000)*100) + rnd.nextInt(100)归来89 999 999 9990和A之间的数。这会产生一些additionating 10 000 000 000数与数之间的110和99 999 999 999。

例如,尝试:

public static long generateID() {

return 10000000000L + ((long)rnd.nextInt(900000000)*100) + rnd.nextInt(100);

}

还是10位数

在10000000000以下的数字,即0到9999999999实际上不是11位数字。

我指的是(long) (Math.random() * 100_000_000_000L)导致0和99_999_999_999之间的数字(含),但其中10%不是11位长,如42只有2位。

@比以前更糟的是…数字1000000000L有10%的机会被提取,而对方有大约0.000000000 1%…-"-"

使用long。这样的:

public static int generateID(){

Random r = new Random();

long numbers = 1000000000L + (long)(r.nextDouble() * 999999999L);

return numbers;

}

"L"是明确告诉编译器,我们要ints longs,逆境。

实际上,如果您不使用这个大数字的L,那么编译器会自己说您是不对的!

正确的。我们告诉编译器使用long

(long)(r.nextDouble() * 999999999L)给出了0和999999998之间的数字。加上1000000000L给出了1000000000和1999999998之间的数字。这只是10位数字,不是问题中要求的11位数字,甚至不是10位数字的完整范围。

我只是拿着他的密码让它工作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值