javaを使用するあるプログラムでいくつかのランダムな値を生成し、2番目のプログラムが実行されるたびにこれらの値を他のプログラムで使用したいとします。実行ごとに値を一定に保つ方法?
この目的は、ランダム値を1回生成し、その後、プログラムの実行ごとに一定値を保持して保持することです。それは何らかの方法で可能ですか?おかげ
javaを使用するあるプログラムでいくつかのランダムな値を生成し、2番目のプログラムが実行されるたびにこれらの値を他のプログラムで使用したいとします。実行ごとに値を一定に保つ方法?
この目的は、ランダム値を1回生成し、その後、プログラムの実行ごとに一定値を保持して保持することです。それは何らかの方法で可能ですか?おかげ
プログラムを終了すると、ファイルに保存していないものはすべて失われます。
私はあなたが思っているほど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
同じファイルを読み取ります。
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
examplesを参考にしていただきありがとうございます。しかし、私は、teradata用のJavaユーザー定義関数のためにこれを必要としました。 500万レコードを生成し、その5百万レコードすべてに対して関数を実行する必要があるかどうかを検討してください。 5百万回の500万レコードを生成するには、何百万もの時間がかかります。 – waqas
それは本当ですが、あなたが何をしても5百万回5百万回は長い時間がかかるでしょう。私は、あなたがこれを行う必要はないので、問題を解決する別の方法があると思う。 –
初めてファイルを読むときにほとんどの時間がかかります。各アクセスはわずか数クロックサイクルで1.8ナノ秒しかかかりません。私はあなたがそれをはるかに速く得ることは疑問であり、まだ役に立つ何かをしています。 –
あなたがランダムに生成し、ファイルに保存乱数
2を生成するために、同じシードを使用して
1を行くことを考えることができるいくつかの方法。プログラム2がファイルを読み取り、値を取得します。
一度だけ生成してからファイルに保存してください... その後、プログラムを実行するたびに、これらの値を再度ロードする必要があります。
最も速い方法は、プログラムを一度実行し、生成された乱数をメモし、プログラム内の配列内の乱数をハードコードすることです。次に、次回以降、プログラムは配列からこれらの同じ値を読み取ることができます。
だから、次のようにプログラムが乱数を生成したと -
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.
、それらをファイルに書きますか? –
Oli私は外部I/Oを使用したくありません。とにかくファイル内にストロークさせずにjvmメモリやその他の方法でそれを実行する方法があります。 – waqas
関連XKCD - http://xkcd.com/221/ –