Рандомизация Числа C#/Java

Действительно ли возможно, от.NET, подражать точной рандомизации тот Java использование? У меня есть семя, и я хотел бы иметь возможность получить те же результаты и в C# и в Java при создании случайного числа.

9
задан jason 27 January 2010 в 08:06
поделиться

6 ответов

Если у вас есть исходный код класса java.util.random для вашей реализации Java, вы можете легко портировать его в .NET.

Если вам требуется обои приложения (Java и .NET), чтобы использовать определенный генератор случайных номеров, вам лучше реализовать один в обеих платформах, так и использовать его вместо этого, поскольку версия системы может изменить свое поведение в результате Обновить. (Похоже, что спецификация Java точно описывает поведение его PRNG.)

5
ответ дан 3 November 2019 в 01:56
поделиться

Вам не нужно читать исходный код. Формула является одноклассником и приведена в документации для 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;
}

Пример:

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

Вывод на обеих платформах 0, 3, 18, 4, 20 .

6
ответ дан 3 November 2019 в 01:56
поделиться

Может быть, имело бы смысл реализовать свой собственный простой псевдослучайный номер-генератор? Таким образом, у вас есть полный контроль и может гараунте одинаковое семена дает одинаковые результаты в обеих средах. Вероятно, немного больше работы, чем портировать один на другой.

0
ответ дан 3 November 2019 в 01:56
поделиться

Другой вариант может быть, чтобы записать свои случайные числа в файл один раз с одной платформы, а затем просто загрузить случайные номера для обеих платформ из этого файла, либо вы можете загрузить их из службы, такой как Random.org

-2
ответ дан 3 November 2019 в 01:56
поделиться

Ну, вы можете посмотреть в исходном коде для Random.java и скопируйте алгоритм, константы и т. Д.ет, но случайные используют систему. Ванотим в своем конструкторе, поэтому вы не получите те же результаты.

от Java.util.random

Публичный случайный () { Это (++ Seeduniquifier + Система .NAnotime ()); }

Я бы вообще удивлен, если источник в C # покажет вам что-то подобное.

Отредактирование: игнорирование, как было отмечено, конструктор, который принимает входное семя, никогда не связывает время.

0
ответ дан 3 November 2019 в 01:56
поделиться

Если вам не нужен криптографически безопасный генератор псевдорандового номера, то я бы пошел для Twister Mersenne Twister . Вы можете найти исходный код для C # здесь и java здесь .

1
ответ дан 3 November 2019 в 01:56
поделиться