Arthur V. Ratz Ответов: 1

C#.NET генерация псевдослучайных чисел: класс C# system.random() против Std:: rand () в C и C++


уважаемый друг,
У меня есть еще один вопрос: действительно ли вы чувствуете какую-либо разницу между генератором псевдослучайных чисел (PRNG), основанным на использовании библиотечной функции std::rand() в C и C++, и аналогичными функциями, библиотеками и пакетами, реализованными для C#.NET ?

Вы знаете, когда я начал использовать PRNG в C#, например System.Класс Random (), а также MathNet.Nurmerics, я заметил, что такие функциональные PRNGs для C#.NET обеспечивают гораздо худшие результаты генерации случайных чисел, чем простая функция std:: rand () в C и C++.

И все же я просто не могу понять, почему ?? Улыбка | :)

С тех пор я даже реализовал свой собственный PRNG, основанный на преобразовании бокса-Мюллера и таких вещах, как _rdtsc (), который является инструкцией процессора с меткой времени чтения для достижения лучших результатов в области генерации случайных чисел. Улыбка | :)

Наконец, может ли кто-нибудь подсказать мне, как использовать несколько PRNG для C#.NET чтобы получить такие же результаты, как если бы использовалась функция std::rand ()??

Что я уже пробовал:

С тех пор я даже реализовал свой собственный PRNG, основанный на преобразовании бокса-Мюллера и таких вещах, как _rdtsc (), который является инструкцией процессора с меткой времени чтения для достижения лучших результатов в области генерации случайных чисел. Улыбка | :)

CPallini

"обеспечить гораздо худшие результаты"
Не могли бы Вы уточнить, пожалуйста?

Arthur V. Ratz

Сейчас я работаю над кодом как на C++, так и на C#, который реализует генетический алгоритм искусственного интеллекта. Как вы, вероятно, знаете, начальная популяция хромосом в этом случае генерируется случайным образом с помощью PRNGs. В частности, для целей инициализации генетического алгоритма настоятельно рекомендуется использовать нормальное случайное распределение, созданное, например, с помощью преобразования бокса-Мюллера или предположения Мерсеннетвист. Когда я обычно использую функцию std:: rand () в C++, которая очень проста, я, очевидно, получаю желаемое качество генерации случайных чисел.

Другой случай-это библиотеки и пакеты для C#.NET например, встроенная система.Random () или MathNet.Библиотека нумнерики. Несмотря на то, что эти библиотеки для C# позволяют либо выполнять простую генерацию случайных чисел, либо выборку для получения различных распределений, включая нормальное распределение, все эти библиотеки для C# действительно не делают того, что они все должны делать.

Если быть более точным, я обычно получаю очень разные результаты по коду, реализующему генетический алгоритм в C++ или C#, по большей части из-за используемого генератора случайных чисел. Когда я запускаю код, написанный на C++, основанный на использовании функции std:: rand (), все идет хорошо, а не при запуске кода C#, если не указано иное.

CPallini

Вы хотите сказать, что случайные числа, полученные из равномерного распределения, преобразованные с помощью бокса-Мюллера, намного лучше, чем те, которые получены из C#? Вы сделали статистический тест?
В качестве дополнительного Примечания, современный C++ обеспечивает более sopishicated (чем rand) генерацию случайных чисел, см.
http://www.cplusplus.com/reference/random/

Arthur V. Ratz

Спасибо за руководство. Я правда так и не сделали каких-либо испытаний, статистика пока на сейчас. Что касается более сложных STL C++ PRNGs, то я знаю о них, но хотел бы подчеркнуть, что, по крайней мере, простой std:: rand () обычно дает лучшие результаты, чем аналогичные функции в C#.NET.

Arthur V. Ratz

Во всяком случае, я был бы очень признателен за любые идеи, как сделать использование PRNGs в C# лучше.

1 Ответов

Рейтинг:
11

RickZeeland

Это CodeProject статьи могут быть вам интересны: Рекомендации по применению генератора случайных чисел[^]


Arthur V. Ratz

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

Спасибо за ваш ответ.