C#随机(长)

use*_*078 6 c# random int seed long-integer

我正在尝试根据C#中的种子生成一个数字.唯一的问题是种子太大而不能成为int32.有没有办法可以长期使用种子?

是的,种子必须很长.

Mat*_*son 2

Java.Util.Random这是我从 Java 规范移植的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;
}
Run Code Online (Sandbox Code Playgroud)