2012-03-14 10 views
1

javaを使用するあるプログラムでいくつかのランダムな値を生成し、2番目のプログラムが実行されるたびにこれらの値を他のプログラムで使用したいとします。実行ごとに値を一定に保つ方法?

この目的は、ランダム値を1回生成し、その後、プログラムの実行ごとに一定値を保持して保持することです。それは何らかの方法で可能ですか?おかげ

+0

、それらをファイルに書きますか? –

+0

Oli私は外部I/Oを使用したくありません。とにかくファイル内にストロークさせずにjvmメモリやその他の方法でそれを実行する方法があります。 – waqas

+0

関連XKCD - http://xkcd.com/221/ –

答えて

4

プログラムを終了すると、ファイルに保存していないものはすべて失われます。

私はあなたが思っているほどIOについて心配する必要はないと思っています。数ミリ秒で数百万の値を読み取ることができるはずです。実際には、何分の1秒で数百万の乱数を生成できるはずです。

Random random = new Random(1); 
long start = System.nanoTime(); 
int values = 1000000; 
for (int i = 0; i < values; i++) 
    random.nextInt(); 
long time = System.nanoTime() - start; 
System.out.printf("Took %.3f seconds to generate %,d values%n", 
        time/1e9, values); 

プリント

Took 0.015 seconds to generate 1,000,000 values 

生成および

int values = 1000000; 
ByteBuffer buffer = ByteBuffer.allocateDirect(4 * values).order(ByteOrder.nativeOrder()); 

Random random = new Random(1); 
long start = System.nanoTime(); 
for (int i = 0; i < values; i++) 
    buffer.putInt(random.nextInt()); 
buffer.flip(); 
FileOutputStream fos = new FileOutputStream("/tmp/random.ints"); 
fos.getChannel().write(buffer); 
fos.close(); 
long time = System.nanoTime() - start; 
System.out.printf("Took %.3f seconds to generate&write %,d values%n", time/1e9, values); 

プリント

Took 0.021 seconds to generate&write 1,000,000 values 

0を書き込みます

同じファイルを読み取ります。

long start2 = System.nanoTime(); 
FileInputStream fis = new FileInputStream("/tmp/random.ints"); 
MappedByteBuffer buffer2 = fis.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, values * 4).order(ByteOrder.nativeOrder()); 
for (int i = 0; i < values; i++) 
    buffer2.getInt(); 
fis.close(); 
long time2 = System.nanoTime() - start2; 
System.out.printf("Took %.3f seconds to read %,d values%n", time2/1e9, values); 

プリント

Took 0.011 seconds to read 1,000,000 values 
同じファイルを読む

繰り返し

long sum = 0; 
int repeats = 1000; 
for (int j = 0; j < repeats; j++) { 
    buffer2.position(0); 
    for (int i = 0; i < values; i++) 
     sum += buffer2.getInt(); 
} 
fis.close(); 
long time2 = System.nanoTime() - start2; 
System.out.printf("Took %.3f seconds to read %,d values%n", time2/1e9, repeats * values); 

プリント

Took 1.833 seconds to read 1,000,000,000 values 
+0

examplesを参考にしていただきありがとうございます。しかし、私は、teradata用のJavaユーザー定義関数のためにこれを必要としました。 500万レコードを生成し、その5百万レコードすべてに対して関数を実行する必要があるかどうかを検討してください。 5百万回の500万レコードを生成するには、何百万もの時間がかかります。 – waqas

+0

それは本当ですが、あなたが何をしても5百万回5百万回は長い時間がかかるでしょう。私は、あなたがこれを行う必要はないので、問題を解決する別の方法があると思う。 –

+0

初めてファイルを読むときにほとんどの時間がかかります。各アクセスはわずか数クロックサイクルで1.8ナノ秒しかかかりません。私はあなたがそれをはるかに速く得ることは疑問であり、まだ役に立つ何かをしています。 –

3

あなたがランダムに生成し、ファイルに保存乱数

2を生成するために、同じシードを使用して

1を行くことを考えることができるいくつかの方法。プログラム2がファイルを読み取り、値を取得します。

+0

ケント私は数百万の後で乱数を毎回生成するとかなりの時間がかかり、同じ時間係数のためにファイルに書き込む必要はありません – waqas

+0

生成する数字の数は、ファイルに書き込むのに時間がかかります? 2番目の問題は、hteファイルからそれらをロードするときにローカル変数にロードするときです。必要なときに毎回ロードするのではなく、それを試しても時間がかかりません。私はmatlabを使ってそうしていましたが、それは時間がかかりませんでした。 – Zeina

0

一度だけ生成してからファイルに保存してください... その後、プログラムを実行するたびに、これらの値を再度ロードする必要があります。

1

最も速い方法は、プログラムを一度実行し、生成された乱数をメモし、プログラム内の配列内の乱数をハードコードすることです。次に、次回以降、プログラムは配列からこれらの同じ値を読み取ることができます。

だから、次のようにプログラムが乱数を生成したと -

0.34、0.15、0.28、0.45、...

あなたはその後、配列を定義し、その中にこれらの値を保存することができます。

その後
randomValues[0] = 0.34; 
    randomValues[1] = 0.15; 
    randomValues[2] = 0.28; 
    randomValues[3] = 0.45; 
    . 
    . 
    . 

たびに、単にあなたが欲しいの乱数を取得するためにインデックスを使用しています。

index = 0; 
randomNumber = randomValues[index]; 
index++; // so the next time, you can get the next random number in sequence. 
関連する問題