Действительно ли возможно, от.NET, подражать точной рандомизации тот Java использование? У меня есть семя, и я хотел бы иметь возможность получить те же результаты и в C# и в Java при создании случайного числа.
Если у вас есть исходный код класса
java.util.random
для вашей реализации Java, вы можете легко портировать его в .NET.
Если вам требуется обои приложения (Java и .NET), чтобы использовать определенный генератор случайных номеров, вам лучше реализовать один в обеих платформах, так и использовать его вместо этого, поскольку версия системы может изменить свое поведение в результате Обновить. (Похоже, что спецификация Java точно описывает поведение его PRNG.)
Вам не нужно читать исходный код. Формула является одноклассником и приведена в документации для 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
.
Может быть, имело бы смысл реализовать свой собственный простой псевдослучайный номер-генератор? Таким образом, у вас есть полный контроль и может гараунте одинаковое семена дает одинаковые результаты в обеих средах. Вероятно, немного больше работы, чем портировать один на другой.
Другой вариант может быть, чтобы записать свои случайные числа в файл один раз с одной платформы, а затем просто загрузить случайные номера для обеих платформ из этого файла, либо вы можете загрузить их из службы, такой как Random.org
Ну, вы можете посмотреть в исходном коде для Random.java и скопируйте алгоритм, константы и т. Д.ет, но случайные используют систему. Ванотим в своем конструкторе, поэтому вы не получите те же результаты.
от Java.util.random
Публичный случайный () { Это (++ Seeduniquifier + Система .NAnotime ()); }
Я бы вообще удивлен, если источник в C # покажет вам что-то подобное.
Отредактирование: игнорирование, как было отмечено, конструктор, который принимает входное семя, никогда не связывает время.
Если вам не нужен криптографически безопасный генератор псевдорандового номера, то я бы пошел для Twister Mersenne Twister . Вы можете найти исходный код для C # здесь и java здесь .