Matlab rand 和 c++ rand()
Posted
技术标签:
【中文标题】Matlab rand 和 c++ rand()【英文标题】:Matlab rand and c++ rand() 【发布时间】:2014-06-13 06:54:34 【问题描述】:我正在尝试将 matlab 代码移植到 c++ 中,并在 matlab 中找到了 rand 的用法。 matlab的rand函数和c++ rand()函数一样吗? 如果没有,在 C++ 或 opencv 中是否有 matlab 的 rand 的内置函数?
【问题讨论】:
代码使用了matlab's rand()的哪个重载? Matlab 是专有软件,所以我想找出答案的唯一方法是在 mathworks 找到一份开发人员的工作。 这是代码,我正在尝试转换uniform=(1/n)*rand+(0:1/n:1);
@JoachimIsaksson
@JoachimIsaksson:因为C和C++都没有定义rand()
产生的随机数序列,所以没关系。
@phresnel 正如您在下面的答案中看到的那样,C++11 标准化了一些随机数生成。我没有声称它在任何地方都可以工作,我只是问了一个问题,以检查即使使用较新的标准也可以解决问题。
【参考方案1】:
鉴于 C++ 标准只是松散地定义了 rand()
,您可以不断言它等同于 matlab 函数。
幸运的是,C++11 现在有一套生成器在标准头文件<random>
中标准化。例如,std::mt19937
是 Mersenne twister 生成器,std::minstd_rand
是允许您配置序列系数的线性同余生成器。
我的猜测是 Matlab 生成器可以用后一个生成器进行复制。有关具体细节,请参阅 Matlab 文档。幸运的是,测试您的代码将是微不足道的。
【讨论】:
目前,MATLAB 默认使用 Mersenne twister。【参考方案2】:Bathsheba 的猜测几乎是正确的:Matlab R2017A 使用 MT19937 算法,而不是 LC 算法作为其默认的随机数生成器; rand.m
的来源其实包含了2002版西村和松本的MT19937的版权声明C Program。
在 C++ 11 中,默认种子设置为 5489,这与 Matlab 的默认种子相同(以及引用的 C 程序中的默认种子)。
所以,下面的 Matlab 代码:
rng('default');
a = rand();
a = rand();
a = rand();
将向 C++ 代码输出相同的值:
std::mt19937 rng;
std::uniform_real_distribution<float> urd(0, 1);
a = urd(rng);
/* skip alternate values */ rng();
a = urd(rng);
/* skip alternate values */ rng();
a = urd(rng);
注意:要复制 Matlab 的输出,请使用 std::uniform_real_distribution<float>
not std::uniform_real_distribution<double>
。
编辑:与 C++ 相比,在每次调用 rand()
后,Matlab 似乎会跳过所有其他值。我将 Matlab 输出与 MSVC 2017 和 GCC 5.4 的输出进行了比较;后者的行为彼此相同。由于无法保证rand()
生成的各个值,因此这种“非标准”行为显然不能归类为错误。
上面的代码示例考虑了这种行为。
【讨论】:
优秀的答案。但是为什么是float
而不是double
? MATLAB 输出双倍。
@CrisLuengo 不确定:可能与以前版本的 Matlab 保持向后兼容性,以便在给定相同脚本的情况下输出与它们相同的伪随机序列。以上是关于Matlab rand 和 c++ rand()的主要内容,如果未能解决你的问题,请参考以下文章
MATLAB002数字信号处理 理论算法与实现001_rand