Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C#/Java Number Randomization

Tags:

java

c#

random

Is it possible, from .NET, to mimic the exact randomization that Java uses? I have a seed, and I would like to be able to recieve the same results in both C# and Java when creating a random number.

like image 827
George Johnston Avatar asked Jan 27 '10 14:01

George Johnston


2 Answers

If you have the source code of the java.util.Random class for your Java implementation, you can easily port it to .NET.

If you require both applications (Java and .NET) to use a certain random number generator, you'd better implement one in both platforms and use it instead, as the system provided version might change its behavior as a result of an update.(Looks like the Java specification precisely describes the behavior of its PRNG.)

like image 41
mmx Avatar answered Nov 07 '22 12:11

mmx


You don't need to read the source code. The formula is a one-liner and is given in the documentation for java.util.Random.

Here's a partial translation:

[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;
}

Example:

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));

Output on both platforms is 0, 3, 18, 4, 20.

like image 97
finnw Avatar answered Nov 07 '22 14:11

finnw