Во всех компиляторах C++ Microsoft, были такие функции — srand принимающая unsigned int, от которого зависело какое то стартовое состояние, а затем функция rand выдавала последовательность рандомных чисел. Например, код
unsigned int gamenumber = 92;
srand(gamenumber);
int u = rand(); // 1-е полученное рандомное число 339
u = rand(); // полученное рандомное число 13532
u = rand(); // полученное рандомное число 26342
...
и так далее. Диапазон выдаваемых функцией rand() значений — 0-32768. А функция srand могла принять 4 миллиарда стартовых состояний. При передаче unsigned int (seed) — в функцию srand, мы могли получить 4 миллиарда различных последовательностей псевдослучайных чисел, и при передаче определенного стартового состояния (в приведенном коде, я передаю 92), на выходе будет всегда одинаковая последовательность случайных чисел, что собственно, и нужно.
Я хочу одну программку с логикой написанной на C++, перевести на C#, и сделать в .NET. Потому мне нужно, чтобы при передаче тех же стартовых состояний (как в примере, 92), получить на выходе те же последовательности рандомных чисел. Код, аналогичный выше приведенному, на C# такой —
int gamenumber = 92;
System.Random random = new System.Random(gamenumber);
int u = random.Next();
u = random.Next();
u = random.Next();
...
На выходе получается другая последовательность рандомных чисел, что не годится. Как получить такую же, как в компиляторе C++ ? В C# random.Next(); возвращает числа в диапазоне от 0 до 4 миллиардов, я попробовал вызывать, задаваю нужный даипазон как в C++ —
int u = random.Next(32768);
все равно на выходе другая последовательность случайных чисел. Попробовал так —
int u = random.Next() % 32768;
и всё равно на выходе другая последовательность случайных чисел... А ведь данный алгоритм Microsoft генерации случайных чисел существовал десятилетия и для всех компиляторов C++. Потому я предположил, что видимо он очень удачный, и используется в C#. Может, есть какое то соответствие? Т.е. можно как-нибудь, задав то же стартовое значение, получить такую же последовательность случайных чисел как в C++ ?
Если кто знает, подскажите. Заранее, спасибо.
Re: Можно ли в C# получить рандомные числа по алгориитму функции rand() в С++ ?
Здравствуйте, Skipper_N, Вы писали:
S_N>Во всех компиляторах C++ Microsoft, были такие функции — srand принимающая unsigned int, от которого зависело какое то стартовое состояние, а затем функция rand выдавала последовательность рандомных чисел. Например, код
Возможно, может получиться вызывать реализацию CRT-шного rand() из С# через какой-нибудь PInvoke?
Re: Можно ли в C# получить рандомные числа по алгориитму функции rand() в С++ ?
Здравствуйте, Skipper_N, Вы писали: S_N> Т.е. можно как-нибудь, задав то же стартовое значение, получить такую же последовательность случайных чисел как в C++ ?
Исходники CRT идут вместе со студией. У меня, например, в C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\crt\src\rand.c:
Здравствуйте, btn1, Вы писали:
B>Здравствуйте, Skipper_N, Вы писали:
S_N>>...на выходе будет всегда одинаковая последовательность случайных чисел, что собственно, и нужно.
B>Нда... вот и выросло поколение, не способное записать в файл десяток чисел!
Если вы не знаете зачем мне это нужно, то не говорите, что можно записать в файл. Программа — логическая игра, я хочу чтобы она была совместима с предыдущей версией, написанной на C++. Причем тут файл с десятком чисел? В принципе можно, только в таком случае мне в файле надо будет хранить сотни миллионов чисел. предлагаете добавить к программе файл весом в много сотен мегабайт? И тому кто захочет скачать, предлагать скачивать и этот файл?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Skipper_N, Вы писали: S_N>> Т.е. можно как-нибудь, задав то же стартовое значение, получить такую же последовательность случайных чисел как в C++ ?
А>Исходники CRT идут вместе со студией. У меня, например, в C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\crt\src\rand.c:
А>
Это что, вся реализация алгоритма получения рандомного числа что ли? А я то думал, что там какой сложный алгоритм.
Спасибо. Буду экспериментировать с исходниками.
Здравствуйте, Skipper_N, Вы писали:
S_N>Это что, вся реализация алгоритма получения рандомного числа что ли? А я то думал, что там какой сложный алгоритм.
Регистры сдвига довольно простые штуковины
За криптографически стойкими последовательностями случайных чисел нужно ходить к CryptoAPI в виндах.