如何正确设置随机数生成器
How to correctly set a random number generator?
为了开发粒子滤波算法的实现,我需要生成与要跟踪的对象相关的运动的假设:如果我设置N样本,并且如果我使用2-by-1状态向量,那么在每一步我都必须生成N对随机值(2-byNmatrix)。此外,如果我知道运动的统计数据(均值和标准差),那么我可以使用均值和标准偏差来生成所有的N值。最后,为了对运动的不确定性进行建模,我可以生成一个噪声矩阵(一个2-by-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中实现的算法一样有效?
我想我只是在这里意外地回答了您的问题,或者至少提供了一个替代解决方案。
https://stackoverflow.com/a/13897938/1899861
我相信这将生成正确的随机数,并且当在英特尔处理器(386486,奔腾)上使用微软C编译时,已经过了致命的测试。
仅供参考,4.0*atan(1.0)产生的PI值比上述环境中的常数好得多。
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 制作具有平均值的随机数生成器
- C++ 随机数生成器:尝试将结果作为向量获取,但通过制作 void 函数来执行此操作而出现错误
- 尝试在 c++ 中创建随机数生成器并收到错误
- 存储并重新加载随机数生成器状态
- 作为随机数生成器的争用条件
- 播种随机数生成器以使用分叉的好方法是什么?
- 随机数生成器的性能因平台而异
- 随机数生成器的种子和状态有什么区别?
- RcppShark 随机森林示例引发有关随机数生成器的异常
- C++多个实例的随机数生成器组种子中增强
- C++随机数生成器仅生成 0 - C++ 11
- GSL+OMP:C++中的线程安全随机数生成器
- 贪吃蛇游戏 - 食物瓷砖的随机数生成器
- 随机数生成器在 C++ 用于 skipList.
- RSA 加密和解密期间的随机数生成器要求
- 如何使用 cpp 设置随机数生成器的语法?
- 产生相同结果的随机数生成器
- C++随机数生成器通常在 Visual Studio 中运行程序时在 2 次后停止生成数字
- 如何正确设置随机数生成器