Как правильно установить генератор случайных чисел?

Чтобы разработать мою реализацию алгоритма фильтра частиц, мне нужно сгенерировать гипотезы о движениях, относящихся к отслеживаемому объекту: если я установлю N образцы и если я использую 2-на-1 вектор состояния, то на каждом шаге я должен генерировать N пары случайных значений (а 2-на-N матрица). Более того, если я знаю статистику движений (среднее и стандартное отклонение), то я мог бы использовать среднее и стандартное отклонение для генерации всех N значений. Наконец, чтобы смоделировать неопределенность движения, я мог бы сгенерировать матрицу шума ( 2-на-N матрица) и добавить его в матрицу движений.

Основываясь на этих предпосылках, я реализовал алгоритм, работающий в Matlab, и использовал следующий код для генерации гипотез движения.

ds_mean = [dx_mean dy_mean];
ds_stddev = [dx_stddev dy_stddev];
d = 5;

V = zeros(2,N);
V(1,:) = normrnd(ds_mean(1),ds_stddev(1),1,N);   % hypotheses of movement on x axis
V(2,:) = normrnd(ds_mean(2),ds_stddev(2),1,N);   % hypotheses of movement on y axis

E = d*randn(2,N);   % weighted noise

M = V + E;   % hypotheses of movement

Возникла проблема, когда мне пришлось реализовать один и тот же алгоритм с использованием C ++ и OpenCV: по существу, в то время как приведенный выше код matlab генерирует хорошие прогнозы (он прекрасно работает), вместо этого тот же код, написанный на C ++ (см. Код ниже), генерирует плохие прогнозы (т.е. далеко от объекта). Зачем?

RNG m_rng;

x_mean = // ...
y_mean = // ...
x_stddev = // ...
y_stddev = // ...

Mat velocity(STATE_DIM, NUM_PARTICLES, DataType<double>::type);
m_rng.fill(velocity.row(0), RNG::NORMAL, x_mean, x_stddev);
m_rng.fill(velocity.row(1), RNG::NORMAL, y_mean, y_stddev);

Mat noise(STATE_DIM, NUM_PARTICLES, DataType<double>::type);
m_rng.fill(noise,RNG::NORMAL,0,1);
noise *= d;   % weighted noise

movements = velocity + noise;

Как убедиться, что алгоритм C ++ работает так же, как алгоритм, реализованный в Matlab?

3

Решение

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

https://stackoverflow.com/a/13897938/1899861

Я полагаю, что это сгенерирует правильные случайные числа и было проверено до смерти при компиляции с использованием Microsoft C на процессорах Intel (386, 486, Pentium).

К вашему сведению, 4,0 * atan (1,0) дает гораздо лучшее значение PI, чем константа в вышеуказанной среде.

2

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

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

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