【问题标题】:Matlab rand and c++ rand()Matlab rand 和 c++ rand()
【发布时间】:2019-01-30 21:58:32
【问题描述】:

我正在尝试将 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 标准化了一些随机数生成。我没有声称它在任何地方都可以工作,我只是问了一个问题,以检查即使使用较新的标准也可以解决问题。

标签: c++ matlab opencv


【解决方案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 保持向后兼容性,以便在给定相同脚本的情况下输出与它们相同的伪随机序列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 2016-10-10
相关资源
最近更新 更多