Повышение против .Net генераторов случайных чисел

Я разработал один и тот же алгоритм (Baum-Welch для оценки параметров скрытой марковской модели) как в F # (.Net), так и в C ++. В обоих случаях я разработал один и тот же тест, который генерирует случайные тестовые данные с известным распределением, а затем использует алгоритм для оценки параметров и обеспечивает сходство с известным правильным ответом.

Проблема в том, что тест работает нормально в случае F #, но не сходится в реализации C ++. Я сравнил оба алгоритма на некоторых реальных данных, и они дают одинаковые результаты, поэтому я предполагаю, что генерация тестовых данных не работает в случае C ++. Отсюда мой вопрос: что такое генератор случайных чисел, который поставляется с .Net 4 (я думаю, что это версия по умолчанию с VS2010)?

В F # я использую:

let random = new Random()
let randomNormal () = //for a standard normal random variable
let u1 = random.NextDouble()
let u2 = random.NextDouble()
let r = sqrt (-2. * (log u1))
let theta = 2. * System.Math.PI * u2
r * (sin theta)
//random.NextDouble() for uniform random variable on [0-1]

В C ++ я использую стандартные классы Boost:

class HmmGenerator
{
public:
HmmGenerator() :
rng(37), //the seed does change the result, but it doesn't  make it work
normalGenerator(rng, boost::normal_distribution<>(0.0, 1.0)),
uniformGenerator(rng, boost::uniform_01<>()) {}//other stuff here as well
private:
boost::mt19937 rng;
boost::variate_generator<boost::mt19937&,
boost::normal_distribution<> > normalGenerator;
boost::variate_generator<boost::mt19937&,
boost::uniform_01<> > uniformGenerator;
};

Стоит ли ожидать разных результатов при использовании этих двух способов генерации случайных чисел?

РЕДАКТИРОВАТЬ: Кроме того, генератор, используемый в .Net доступен в Boost (в идеале с теми же параметрами), чтобы я мог запустить его в C ++ и сравнить результаты?

2

Решение

Отсюда мой вопрос: что такое генератор случайных чисел, который поставляется с .Net 4 (я думаю, что это версия по умолчанию с VS2010)?

От документация по Random

Текущая реализация класса Random основана на алгоритме вычитающего генератора случайных чисел Дональда Кнута. Для получения дополнительной информации см. Д. Е. Кнут. «Искусство компьютерного программирования, том 2: Получисленные алгоритмы». Аддисон-Уэсли, Рединг, Массачусетс, второе издание, 1981.

.

Стоит ли ожидать разных результатов при использовании этих двух способов генерации случайных чисел?

Алгоритм Мерсенна-Твистера, который вы используете в C ++, считается очень респектабельным по сравнению с другими стандартными генераторами случайных чисел.

Я подозреваю, что любое расхождение в ваших кодах лежит в другом месте.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]