我正在尝试将matlab代码移植到c ++中,并在matlab中找到了rand的用法。 matlab的rand函数和c ++ rand()函数是否相同? 如果没有,在C ++或opencv中是否有matlab的rand的内置函数?
答案 0 :(得分:5)
鉴于C ++标准只是松散地定义rand()
,你可以不断言它等同于matlab函数。
幸运的是,C ++ 11现在有一套生成器, 标准化的标准包括标头<random>
。例如,std::mt19937
是一个Mersenne twister生成器,std::minstd_rand
是一个线性同余生成器,允许您配置序列系数。
我的猜测是Matlab生成器可以用后者复制。有关具体细节,请参阅Matlab文档。幸运的是,测试代码将是微不足道的。
答案 1 :(得分:1)
Bathsheba的猜测几乎是正确的:Matlab R2017A使用MT19937算法,而不是LC算法作为默认随机数生成器; rand.m
的来源实际上包括2002年版Nishimura和Matsumoto的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>
不是 std::uniform_real_distribution<double>
。
EDIT :与C ++相比,在每次调用rand()
之后,Matlab似乎跳过了所有其他值。我已经将Matlab的输出与MSVC 2017和GCC 5.4的输出进行了比较;后者的行为彼此相同。由于无法保证rand()
产生的各个值,因此这种“非标准”行为显然不能归类为错误。
上面的代码示例考虑了此行为。