我有点学习随机数生成和概念的概念. 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