Java中快速高效的随机数生成方法

Java中快速高效的随机数生成方法,java,random,Java,Random,我正在编写一个多线程Java程序,该程序生成大量随机数 其他详细信息: 这些数字用于创建0-99之间的随机数字列表,无需重复,因此0-99范围内的每个数字都存在于列表中(换句话说,该列表包含0-99范围内的100个唯一元素) 生成随机数[已经尝试过的事情!] 我有一个从0到100的数字数组列表。我生成一个随机数并将其用作索引,用于从ArrayList中弹出一个元素 我使用过Collections.shuffle() 以下是方法1的代码: ArrayList<Integer> arr

我正在编写一个多线程Java程序,该程序生成大量随机数

其他详细信息: 这些数字用于创建0-99之间的随机数字列表,无需重复,因此0-99范围内的每个数字都存在于列表中(换句话说,该列表包含0-99范围内的100个唯一元素)

生成随机数[已经尝试过的事情!]

  • 我有一个从0到100的数字数组列表。我生成一个随机数并将其用作索引,用于从
    ArrayList
    中弹出一个元素
  • 我使用过
    Collections.shuffle()
  • 以下是方法1的代码:

    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);