c - MEX C 中的伪随机数生成

标签 c matlab random mex standard-library

根据定义,函数 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 而不是 mexPrintfint 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/

相关文章:

random - 无无理操作的正态分布随机函数

haskell - 为什么随机类没有最小完整定义

c++ - 在 MATLAB 中解析具有十六进制浮点常量的文件

c++ - 为什么编译器允许字符串文字不是 const?

matlab - 从终端运行 Octave 脚本时如何隐藏绘图输出?

python - MATLAB 结构体数组的 Python 版本是什么

c - 为什么我会在 C 中收到此错误?

c - 使用指针时,编译时出现与不完整类型相关的未知原因

regex - matlab正则表达式检查脚本中是否设置了变量

c++ - 随机但可预测的数字生成器? [C++]