C#/ Java数字随机化

Geo*_*ton 9 c# java random

从.NET可以模仿Java使用的确切随机化吗?我有种子,我希望能够在创建随机数时在C#和Java中收到相同的结果.

fin*_*nnw 6

您无需阅读源代码.该公式是单线程,在文档中给出java.util.Random.

这是部分翻译:

[Serializable]
public class Random
{
    public Random(UInt64 seed)
    {
        this.seed = (seed ^ 0x5DEECE66DUL) & ((1UL << 48) - 1);
    }

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

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

        long bits, val;
        do
        {
            bits = Next(31);
            val = bits % (UInt32) n;
        }
        while (bits - val + (n - 1) < 0);

        return (int) val;
    }

    protected UInt32 Next(int bits)
    {
        seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);

        return (UInt32)(seed >> (48 - bits));
    }

    private UInt64 seed;
}
Run Code Online (Sandbox Code Playgroud)

例:

Random rnd = new Random(42);
Console.WriteLine(rnd.NextInt(10));
Console.WriteLine(rnd.NextInt(20));
Console.WriteLine(rnd.NextInt(30));
Console.WriteLine(rnd.NextInt(40));
Console.WriteLine(rnd.NextInt(50));
Run Code Online (Sandbox Code Playgroud)

两个平台上的输出都是0, 3, 18, 4, 20.


Meh*_*ari 5

如果您拥有java.util.RandomJava实现的类的源代码,则可以轻松地将其移植到.NET.

如果您需要两个应用程序(Java和.NET)使用某个随机数生成器,您最好在两个平台中实现一个并使用它,因为系统提供的版本可能会因更新而改变其行为.(看起来Java规范精确地描述了其PRNG的行为.)

  • @dtb:该算法在Java的Random类文档中指定,因此也是规范.实现细节可能会发生变化,但我非常怀疑它在未来版本中生成的实际序列.如果有的话,他们更有可能在一个单独的班级中添加不同的PRNG.但鉴于Java的预期范围和成熟的库实际上在伪随机数生成方面做得很好,我怀疑无论如何都会发生. (4认同)