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&lt;float&gt; not std::uniform_real_distribution&lt;double&gt;

编辑:与 C++ 相比,在每次调用 rand() 后,Matlab 似乎会跳过所有其他值。我将 Matlab 输出与 MSVC 2017 和 GCC 5.4 的输出进行了比较;后者的行为彼此相同。由于无法保证rand() 生成的各个值,因此这种“非标准”行为显然不能归类为错误。 上面的代码示例考虑了这种行为。

【讨论】:

优秀的答案。但是为什么是float 而不是double? MATLAB 输出双倍。 @CrisLuengo 不确定:可能与以前版本的 Matlab 保持向后兼容性,以便在给定相同脚本的情况下输出与它们相同的伪随机序列。

以上是关于Matlab rand 和 c++ rand()的主要内容,如果未能解决你的问题,请参考以下文章

matlab 全部的随机数函数之内部函数

[原创]Matlab生成随机数

MATLAB002数字信号处理 理论算法与实现001_rand

Matlab产生随机数

Matlab中randrandnrandirands的区别以及用randn生成白噪声的示例

Matlab中randrandnrandirands的区别以及用randn生成白噪声的示例