为什么我的编译RAND函数给出相同的值每次我跑我的MATLAB生成独立的应用程序的时间?

176次(最近30天)
我试图编译下面一个可执行的代码:
功能myrand
一个=兰特(4,1);
DISP(a)中
当我运行可执行文件,RAND函数总是返回相同的一组数字。但是,如果我在运行MATLAB代码,该函数给出不同的结果,当我反复调用它。
同样的事情发生,如果我生成与Matlab的编码器可执行文件。

接受的答案

MathWorks的金宝app支持团队
在单机应用的RAND函数生成相同的数字在每次运行你的应用程序,因为统一的随机数生成器,应用程序加载时RAND用途被初始化为同一状态的时间。
你会发现,每次启动一个新的MATLAB会话时,由RAND返回的随机数是相同的。这是因为MATLAB的随机数生成器初始化为每次MATLAB启动时相同的状态。
如果你想在每一个MATLAB会话生成不同的随机值,可以使用系统时钟在每个MATLAB会议开始初始化随机数生成器一次。
在与R2008b开始MATLAB的版本中,要做到这一点最简单的方法是在每个MATLAB会议开始执行下面的命令:
复位(RandStream.getDefaultStream,总和(100 *时钟))
对于之前R2008b MATLAB的版本中,你可以执行以下命令:
兰特(“扭腰”,总和(100 *时钟))
randn('州',总和(100 *时钟))
在这两种情况下,只需要在每个MATLAB会话开始一次做到​​这一点。
同样,您可以在独立的应用程序执行相同的命令(S)。您编译代码可能看起来像下面这样:
功能myrand2
复位(RandStream.getDefaultStream,总和(100 *时钟))
一个=兰特(4,1);
DISP(a)中
当编译该一个可执行,所述随机数生成器的状态被初始化的每个应用程序运行时基于系统时钟,所以阵列的“a”在上面的例子将包含一个唯一的值每一次。
请记住,这只是需要初始化用户在使用系统时钟一旦随机数发生器。
对于Matlab的编码器,你必须使用一个稍微不同的方法,因为时钟不支持代码生成。金宝app
例如,考虑
功能myrand2
coder.cinclude( ' “time.h中”')
SD = 0;
SD = coder.ceval( '时间',[]);
RNG(SD, '捻线机');一个=兰特(4,1);DISP(a)中
有关MATLAB的随机数生成器的更多信息,你可以通过在MATLAB命令提示符下执行以下命令来检查文件:
DOCRandStream
%要么
救命RandStream

更多的答案(1)

格雷格
格雷格 在2018年10月24日
在R2013a,“getDefaultStream”是为RandStream改为“getGlobalStream”。在此之前,它产生表明其最终消除警告,但它开始在R2013a示数。对于发布R2013a - R2018b(可能是过去了,但R2018b是在写作时最新的),使用:
复位(RandStream.getGlobalStream,总和(100 *时钟));
对于之前的版本R2013a,看到其他的答案。

0评论

登入评论。

登入回答这个问题。