6

C# でシードに基づいて数値を生成しようとしています。唯一の問題は、シードが大きすぎて int32 にならないことです。long をシードとして使用する方法はありますか?

はい、シードは long でなければなりません。

4

2 に答える 2

2

これは、Java 仕様からJava.Util.Random移植した C# バージョンです。

最善の方法は、大量の数値を生成する Java プログラムを作成し、この C# バージョンが同じ数値を生成することを確認することです。

public sealed class JavaRng
{
    public JavaRng(long seed)
    {
        _seed = (seed ^ LARGE_PRIME) & ((1L << 48) - 1);
    }

    public int NextInt(int n)
    {
        if (n <= 0)
            throw new ArgumentOutOfRangeException("n", n, "n must be positive");

        if ((n & -n) == n)  // i.e., n is a power of 2
            return (int)((n * (long)next(31)) >> 31);

        int bits, val;

        do
        {
            bits = next(31);
            val = bits % n;
        } while (bits - val + (n-1) < 0);
        return val;
    }

    private int next(int bits)
    {
        _seed = (_seed*LARGE_PRIME + SMALL_PRIME) & ((1L << 48) - 1);
        return (int) (((uint)_seed) >> (48 - bits));
    }

    private long _seed;

    private const long LARGE_PRIME = 0x5DEECE66DL;
    private const long SMALL_PRIME = 0xBL;
}
于 2013-03-17T16:55:12.473 に答える
0

ここで@Dypplが提供する答えに行きます:長距離の乱数、これは方法ですか?

乱数を生成する必要があるコードからアクセスできる場所にこの関数を配置します。

long LongRandom(long min, long max, Random rand) 
{
    byte[] buf = new byte[8];
    rand.NextBytes(buf);
    long longRand = BitConverter.ToInt64(buf, 0);
    return (Math.Abs(longRand % (max - min)) + min);
}

次に、次のように関数を呼び出します。

long r = LongRandom(100000000000000000, 100000000000000050, new Random());
于 2015-02-04T15:45:10.280 に答える