根据定义,函数 srand(seed)
为 rand()
使用的随机数生成器提供种子。如果未调用,则根据 the documentation 默认种子为 1
.考虑以下 MEX 代码 test.c
:
#include "mex.h"
#include <stdlib.h>
void mexFunction(int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{
srand(1);
mexPrintf("%lf\n",(double)rand()/(double)RAND_MAX);
}
当从 Matlab 调用时,它总是返回相同的随机数:
>> mex test.c
>> test
0.001251
>> test
0.001251
>> test
0.001251
考虑以下代码 test2.c
,其中 srand()
在随机数生成之前未被调用:
#include "mex.h"
#include <stdlib.h>
void mexFunction(int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{
mexPrintf("%lf\n",(double)rand()/(double)RAND_MAX);
}
此代码在第一次调用时返回相同的随机数,但每次后续调用都会返回不同的数字:
>> mex test2.c
>> test2
0.001251
>> test2
0.563585
>> test2
0.193304
考虑到 srand()
的默认行为,我不明白为什么省略 srand(1)
会在每次调用时产生不同的随机数。事实上,在 Matlab 外部编译和运行 test2.c
(使用 printf
而不是 mexPrintf
,int main()
而不是 void mexFunction(...)
等)总是返回相同的随机数,正如预期的那样。
为什么 MEX 会这样?
最佳答案
MEX 文件是共享库(具有特殊的入口函数 mexFunction
),在执行时由 MATLAB 动态加载。除非您清除它们,否则它们会一直加载在内存中。
示例:
最初未加载 MEX 文件(忽略来自另一个工具箱的其他 MEX 文件):
>> [~,X] = inmem('-completenames')
X =
'C:\Program Files\MATLAB\R2014a\toolbox\slvnv\reqmgt\reqmgt.mexw64'
现在我们调用 MEX 函数:
>> test2
0.001251
>> test2
0.563585
>> [~,X] = inmem('-completenames')
X =
'C:\Program Files\MATLAB\R2014a\toolbox\slvnv\reqmgt\reqmgt.mexw64'
'C:\Users\Amro\Desktop\test2.mexw64' % <-- our MEX-file
接下来我们显式地从内存中卸载 MEX 函数(clear all
也可以):
>> clear test2
>> [~,X] = inmem('-completenames')
X =
'C:\Program Files\MATLAB\R2014a\toolbox\slvnv\reqmgt\reqmgt.mexw64'
当我们现在调用 MEX 函数时,它会再次加载和初始化(再现相同的随机数序列,因为生成器被重置为相同的默认状态):
>> test2
0.001251
关于c - MEX C 中的伪随机数生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24394593/