Java中快速高效的随机数生成方法
我正在编写一个多线程Java程序,该程序生成大量随机数 其他详细信息: 这些数字用于创建0-99之间的随机数字列表,无需重复,因此0-99范围内的每个数字都存在于列表中(换句话说,该列表包含0-99范围内的100个唯一元素) 生成随机数[已经尝试过的事情!]Java中快速高效的随机数生成方法,java,random,Java,Random,我正在编写一个多线程Java程序,该程序生成大量随机数 其他详细信息: 这些数字用于创建0-99之间的随机数字列表,无需重复,因此0-99范围内的每个数字都存在于列表中(换句话说,该列表包含0-99范围内的100个唯一元素) 生成随机数[已经尝试过的事情!] 我有一个从0到100的数字数组列表。我生成一个随机数并将其用作索引,用于从ArrayList中弹出一个元素 我使用过Collections.shuffle() 以下是方法1的代码: ArrayList<Integer> arr
ArrayList
中弹出一个元素Collections.shuffle()
ArrayList<Integer> arr = new ArrayList<Integer>();
for (int i = 0; i < N; i++){
arr.add(i, i);
}
for(int i=0; i<N; i++){
int indx = rand.nextInt(arr.size());
res.add(arr.get(indx));
arr.remove(indx);
}
ArrayList arr=new ArrayList();
对于(int i=0;i 对于(int i=0;i我的方法是使用示例中的Math.random()
方法生成数字,并通过静态init块初始化列表,如下所示:
private static List<int> list = new ArrayList<int>();
static {
for(int i = 0; i < 100; i++) {
// randomize number
list.add(number);
}
}
private static List=new ArrayList();
静止的{
对于(int i=0;i<100;i++){
//随机数
列表。添加(编号);
}
}
希望这有帮助,玩得开心!要洗牌一个由n个元素组成的数组(索引0..n-1):
检查算法。我认为问题在于使用默认实例,即线程安全的单实例。您说您的程序是多线程的,因此我可以想象,随机
中的同步是一个瓶颈
如果您正在Java 7上愉快地运行,只需使用即可。仔细看,有一个版本可以显式地获取Random
实例:
Collections.shuffle(arr, threadLocalRandom);
其中,threadLocalRandom
仅创建一次
在Java 6上,您可以简单地为每个线程创建一个Random
的单个实例。请注意,您不应该为每次运行创建一个Random
的新实例,除非您每次都可以提供随机种子。部分问题可能是整数装箱和取消装箱的开销。您可能会发现重新实现Fisher Yates直接在int[]
上洗牌,你说你找到了Collections.shuffle()
比第一种方法慢。请问要多少?对于100个数字,两种方法都需要几乎不可察觉的时间。您生成的是随机排列的唯一数字。不是随机数字。这有很大的区别。@dlev我实际上没有从程序内部测量时间。我使用的是Netbeans profiler。但是,在第一种情况下,时间大约为50毫秒,而第二种情况下,整个过程的时间为80毫秒program@Jeffrey是的,很抱歉使用这种语言!请进行相应的编辑。@Jeffrey:在数学中,提取元素(数字)是常见的做法没有重复。我认为命名这些随机数是完全正确的。这正是Collections.shuffle()
所做的。好与坏:-)。很好,因为您的伪代码是正确的。糟糕-因为OP已经尝试过了,但运气不好。
Collections.shuffle(arr, threadLocalRandom);