0
public float randomNumber(float x, float y, Random rnd)
{
    //Return a random number between 0 - 1
}

だから私の問題は、乱数をxとyに関連付ける必要があるということです。x = 10、y = 5を渡して、x = 10、y = 5をもう一度渡すと、0.34567fが出た場合、0.34567fの結果が再び必要になります。誰かがこれを行う方法を知っていますか?

編集:以下の回答に基づいて、私は何かを忘れていることに気づきました。Randomオブジェクトを渡す理由は、他の場所で事前にシードされているためです。したがって、シードが50のランダムオブジェクトに対してx = 10、y = 5を渡し、シードが51のランダムオブジェクトで同じことを行う0.34567fを取得すると、別の結果が得られるはずです。

4

3 に答える 3

3

それらをシードとして使用できます。

int seed = 
    BitConverter.ToInt32(BitConverter.GetBytes(
        x * 17 + y
    ));
new Random(seed).NextDouble();
于 2012-08-29T17:04:29.347 に答える
2

xとyをシード値として使用します

public float RandomNumber(float x, float y)
{
    var rnd = new Random(x.GetHashCode() ^ y.GetHashCode());
    return (float)rnd.NextDouble();
}

注:^オペレーターは、xとyのビットに対してXOR演算を実行します。


更新(SLaks、Servy、Scott Chamberlainのコメントに応えて)

あなたの「乱数」はまったく乱数ではありません。おそらく必要なのはハッシュコードです

public Hash(float x, float y)
{
    unchecked {
        return Math.Abs((527 + x) * 31 + y) % 1.0f;
    }
}
于 2012-08-29T17:04:01.063 に答える
1

本当に必要なのは、乱数ではなくハッシュのようです。2つのフロートに基づく一連の乱数が必要な場合は、これら2つのフロートを使用してシードを作成することをお勧めしますが、単一の値のみが必要な場合は、効率が大幅に低下し、ハッシュには特に適していません。あなたはこのようなことを試すことができます。

public float GetHashCode(float x, float y)
{
    float somePrimeNumber = 17.0
    return Math.Abs(1.0 / (x.GetHashCode() * somePrimeNumber + y.GetHashCode() + 1));
}
于 2012-08-29T17:09:26.677 に答える