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# лучше.