Я разработал один и тот же алгоритм (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 ++ и сравнить результаты?
Отсюда мой вопрос: что такое генератор случайных чисел, который поставляется с .Net 4 (я думаю, что это версия по умолчанию с VS2010)?
Текущая реализация класса Random основана на алгоритме вычитающего генератора случайных чисел Дональда Кнута. Для получения дополнительной информации см. Д. Е. Кнут. «Искусство компьютерного программирования, том 2: Получисленные алгоритмы». Аддисон-Уэсли, Рединг, Массачусетс, второе издание, 1981.
.
Стоит ли ожидать разных результатов при использовании этих двух способов генерации случайных чисел?
Алгоритм Мерсенна-Твистера, который вы используете в C ++, считается очень респектабельным по сравнению с другими стандартными генераторами случайных чисел.
Я подозреваю, что любое расхождение в ваших кодах лежит в другом месте.
Других решений пока нет …