如何填充100,000,000个元素阵列?

时间:2011-10-25 05:24:53

标签: java arrays

我在考虑使用循环在每个元素中存储一个随机数。有一个更好的方法吗?我需要随机数来测试我的种类和时间。

6 个答案:

答案 0 :(得分:5)

一个简单的伪代码:

int[] random = new int[10000000];

for (int i = 0; i < random.length; i++) {
   random[i] = generateAbsoluteRandom();
}

答案 1 :(得分:0)

每次都需要一个不同的随机集吗?如果没有,生成一个所需大小的随机数组,序列化并存储它。在需要时加载它。那可能会跑得更快。

答案 2 :(得分:0)

简单的方法将是最好的:

  • 分配大数组
  • 对于每个元素
    • 生成随机数
    • 分配给元素。

瓶颈将是对随机数生成器的调用,你无法避免这些...如果你想要随机数。

只需以简单的方式编写代码,让JIT编译器担心优化它。只有在对您的应用程序进行概要分析时才会明白应用程序的这一部分是一个重要的性能问题。

答案 3 :(得分:0)

你总是可以去多线程。数组的大小应该保证创建线程的成本。

import java.util.Random;

public class SimpleTest implements Runnable {

    public static int[] array = new int[1000];
    private int startPoint;

    public SimpleTest(int startPoint) {
        this.startPoint = startPoint;
    }   

    public static void main(String[] args) throws InterruptedException {
        // TODO Auto-generated method stub
        Thread test1 = new Thread(new SimpleTest(0));
        Thread test2 = new Thread(new SimpleTest(1));
        test1.start(); test2.start();
        while(test1.isAlive() || test2.isAlive()) {
            Thread.sleep(10);
            System.out.println("Waiting...");
        }
        System.out.println("Done!");
    }

    public void run() {
        Random r = new Random();
        for (int i = startPoint; i < array.length; i+=2) {
            array[i] = r.nextInt();
            System.out.println("Thread "+(startPoint+1)+" has put a value no. "+i+" and it was: "+array[i]);
        }
    }   

}

修改 嗯,我检查了执行时间,我的双芯机没有任何改进。似乎数组的大小并不能保证创建线程的成本,或者我在这里缺少其他东西。

<强> EDIT2 当我将它分成8个线程(; P)时,改进非常大 - 我从约3900ms开始下降到~2500。这有什么东西......

答案 4 :(得分:0)

为什么需要存储值?如果设置种子值,您将从随机中获得相同的值序列。

  

随机r =随机(856007); //或任何数字来标识给定的序列

     

n = r.nextInt();

答案 5 :(得分:0)

我没有费心去测试这是否是实际加速,但您可以考虑制作正确大小的ByteBuffer(4字节* 100000000个元素),然后用Random.nextBytes填充它。从那里,在它上面调用asIntBuffer,你将得到一个充满整数的缓冲区。

我已经证明这不是更快,也不会影响你的结果分布 - 但如果你真的在寻找速度,你可以尝试一下。