6

ソートアルゴリズムをカンパレするプログラムを作成しています。大量の数字を使用しています。乱数でいっぱいの配列を作成する際にパフォーマンスの問題があります。

速くする方法はありますか?

現在私は使用しています:

int[] temp = new int[length];      
for(int i = 0; i < temp.length; i++)
{
   temp[i] = generator.nextInt(temp.length * 10);
}

どこ

generator = new Random();
4

4 に答える 4

1

より速くしたい場合は、独自の乱数ジェネレーターを作成できます。これは、ランダム性は低くなりますが、より高速になります。

残念ながら、これはcコードですが、javaに変換できます。http://en.wikipedia.org/wiki/Random_number_generationから取得

アプリケーションの場合、これで十分です。暗号化ではありません。

m_w = <choose-initializer>;    /* must not be zero */
m_z = <choose-initializer>;    /* must not be zero */

uint get_random()
{
    m_z = 36969 * (m_z & 65535) + (m_z >> 16);
    m_w = 18000 * (m_w & 65535) + (m_w >> 16);
    return (m_z << 16) + m_w;  /* 32-bit result */
}
于 2012-12-02T23:36:06.040 に答える
1

私が見ているのは、ボトルネックが繰り返しの random() 操作であることです。random() 操作を減らすことができれば、最終的にはパフォーマンスが向上します。

まず、非常に大きな文字列、バイト配列、または数値を生成します。これにより、大規模な初期ランダム データが 1 つだけ作成されます。後で操作するデータのプールと考えてください。

後続の操作は、これを反復処理して乱数を抽出します。

このようにして、ランダム データを 1 回だけ生成することで、ランダム データ生成のボトルネックを解消します。

真のランダムは間違いなくパフォーマンスを低下させるため、真のランダムではなく疑似ランダムを使用してください。

于 2012-12-02T23:55:11.510 に答える
1

for ループと newtInt 引数の最大値を 1 回だけ計算するか、length変数を直接使用して、少し高速化を試みることができます。そして、静的乱数ジェネレーターを 1 つだけ持つことによって。

private static final Random GENERATOR = new Random();   

int[] temp = new int[length];      
int tempLen = length * 10;
for(int i = 0; i < length; i++)
{
   temp[i] = GENERATOR.nextInt(tempLen);
}
于 2012-12-02T23:32:21.730 に答える
1

Uncommons Mathsライブラリを使用してみてください。などと比較して高性能のために実装されているさまざまな乱数ジェネレーターをアドバタイズしjava.util.Randomます。XORShiftRNGたとえば、次をご覧ください。

非常に高速な疑似乱数ジェネレーター。説明については、このページを参照してください。この RNG の周期は約 2^160 で、 ほど長くはありませんMersenneTwisterRNGが、より高速です。

免責事項: 私は個人的にこのライブラリを使用した経験がなく、Google で検索して見つけただけです。

于 2012-12-02T23:47:18.867 に答える