在用Matlab与3DEC/UDEC进行交互时,由于真实模型较大,有时候会先生成一个用于测试的小模型,这时候会经常用到 Matlab 的随机数函数生成随机数。但是每次运行程序,随机数都不一样,导致测试模型不能重复测试,这时候就需要让Matlab生成可重复的随机数。
1. Matlab中如何让随机数可重复
通过首先指定种子来重复生成随机数数组。每次使用相同种子初始化生成器时,始终都可以获得相同的结果。
首先,初始化随机数生成器:
rng('default');
现在使用种子 1
初始化生成器。
rng(1);
然后创建随机数数组
A = rand(3,3)
得到一个随机数矩阵
0.4170 0.3023 0.1863
0.7203 0.1468 0.3456
0.0001 0.0923 0.3968
这时候如果接着创建随机数数组,
C = rand(3,3)
会得到另一个不同的随机数矩阵
0.5388 0.2045 0.6705
0.4192 0.8781 0.4173
0.6852 0.0274 0.5587
如何能得到与A相同的随机数矩阵呢?这时就需要配合使用种子初始化生成器,将种子生成器与生成随机数函数一起使用即可放心食用。
rng(1)
B=rand(3)
这时候就得到了与A相同的随机数矩阵了
0.4170 0.3023 0.1863
0.7203 0.1468 0.3456
0.0001 0.0923 0.3968
在某些情况下,只设定种子并不能保证相同的结果。这是因为代码执行时,随机数函数所用的生成器可能与你所期望的不同。要确保长期可重复性,应同时指定种子和生成器类型。
例如,以下代码将种子设定为 1
并将生成器设置为梅森旋转。
rng(1,'twister');
接着与上面一样使用即可。不仅可以按如上所述为随机数生成器重新提供种子,还可以选择要使用的随机数生成器的类型。不同的生成器类型会产生不同的随机数序列,例如,可以因为其统计学属性而选择特定的类型。或者,可能需要从使用不同默认生成器类型的旧版 MATLAB 重新创建结果。具体可以参考MathWorks控制随机数的生成
2. 3DEC中如何生成可重复的随机数
在3DEC中可以使用 set random nseed
或者 set seed n
来设置生成随机数的种子。
set random nseed
的作用:
将随机数生成器(由 GENERATE
和 JSET
命令使用)的种子设置为整数 nseed。 默认情况下,nseed 等于10000,设定的种子值应与默认值的量级相同。 如果在 NEW
命令后给出 SET random
,则在多次运行中可以生成相同的模型。 注:随机种子不会被 NEW 命令重置。
简单来说,该命令可以重复多次划分相同的网格或者节理,以便模型可以多次重复运行。否则,每次划分的网格或者节理都会有差异。
set seed n
的作用:
为 urand
和 grand
设置随机数生成器的种子。 该种子也由 DFN
生成器使用。
一般在new命令后设置随机数种子。
3. 结合Matlab和3DEC进行重复模型的生成
通过 Matlab 生成随机节理高度,再转换成 3DEC 命令流。结合种子生成器,生成可重复执行的模型: