3

同じ入力(私の場合はある種のハッシュ)でシードされた場合、常に同じ疑似乱数のセットを生成する、標準のクロスプラットフォーム番号ジェネレーター/アルゴリズム/ライブラリはありますか?

理想的には、任意のターゲットマシンのJavaと.Netの両方でこのクロスプラットフォームを実行し、同じ一貫した出力(漠然とランダムな整数)を取得できるようにしたいと思います。

それが不可能な場合は、自分でロールします(ランダム性の要件は非常に低く、基本的にIDに基づいて何かに異なる色を割り当てるために使用されます-何があっても、常に同じアイテムに同じ色を割り当てたいだけです私が実行しているシステム)。

4

1 に答える 1

4

非常にシンプルでよく知られているRNGアルゴリズム、「Multiply-with-Carry」があります。これは、私が知っているすべてのプラットフォームに簡単に実装できます。それはあなたが要求している特性を持っています。ランダム性が適切かどうかを判断するのはあなた次第です。

ウィキペディアから:

単純な疑似乱数ジェネレーターの例は、GeorgeMarsagliaによって発明されたMultiply-with-carryメソッドです。これは計算が高速で、(暗号的に強力ではありませんが)優れたランダム性を備えています。

そして、これがC#での非常に単純な実装であり、他の言語に問題なく適応できます。

static int m_w = 1337;      // Choose initialization value, must not be zero
static int m_z = 123123;    // Choose initialization value, must not be zero

int GetRandom() 
{
    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 */
}

m_wとm_zの初期値はシードです。

于 2012-09-25T17:39:06.780 に答える