java 唯一随机数_java – 特定时间戳的唯一随机数

我有点学习随机数生成和概念的概念. java中的多线程.

我们的想法是不在特定的毫秒内生成范围1000的重复随机数(考虑到,多线程方式不超过50个数据将在毫秒内处理).因此,在特定时间生成的随机数列表是唯一的.你能不能给我任何想法,因为我最终会在特定的毫秒内产生几个重复的随机数(也有相当大的概率).

我尝试了以下失败的事情.

Random random = new Random(System.nanoTime());

double randomNum = random.nextInt(999);

//

int min=1; int max=999;

double randomId = (int)Math.abs(math.Random()* (max - min + 1) + min);

//

Random random = new Random(System.nanoTime()); // also tried new Random();

double randomId = (int)Math.abs(random.nextDouble()* (max - min + 1) + min);

当我附加正在生成的时间戳时,在多线程环境中,我看到为5000个唯一数据生成(2-4次)相同的ID(大约8-10).

解决方法:

此类允许您从特定范围获取非重复值,直到使用整个范围.使用范围后,将重新初始化.

类带有一个简单的测试.

如果要使类线程安全,只需将synchronized添加到nextInt()声明即可.

然后,您可以使用单例模式或仅使用静态变量从多个线程访问生成器.这样,所有线程都将使用相同的对象和相同的唯一ID池.

public class NotRepeatingRandom {

int size;

int index;

List vals;

Random gen = new Random();

public NotRepeatingRandom(int rangeMax) {

size = rangeMax;

index = rangeMax; // to force initial shuffle

vals = new ArrayList(size);

fillBaseList();

}

private void fillBaseList() {

for (int a=0; a

vals.add(a);

}

}

public int nextInt() {

if (index == vals.size()) {

Collections.shuffle(vals);

index = 0;

}

int val = vals.get(index);

index++;

return val;

}

public static void main(String[] args) {

NotRepeatingRandom gen = new NotRepeatingRandom(10);

for (int a=0; a<30; a++) {

System.out.println(gen.nextInt());

}

}

}

标签:java,multithreading,data-structures

来源: https://codeday.me/bug/20190825/1719238.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值