绝大多数的离散事件仿真软件都具有随机数的功能,通过随机数可以体现仿真事件的不确定性,保证仿真过程更加真实可靠。
计算机产生的随机数都是伪随机数,因此不同的仿真软件采用不同的随机数算法。Plant Simulation每一个版本都带有强大的随机数发生器,在11.0版本之前(老版本),采用MLCG算法产生随机数,从11.0版本开始(新版本),采用了更加强大的MRG63k3a+随机数算法。新版本中随机数算法到底有多强,软件开发人员是这样描述的:如果用一台8核,主频3GHz,i7 CPU 计算机每秒能够产生240亿个随机数,那么假使让这台计算机从宇宙大爆炸开始到现在计算138亿年,它也仅仅计算出了该随机数算法一个完整周期的3.38 / (10^86)!!!
关于伪随机数的产生原理和算法,往深里讲是一门学科,在这里不做深入研究。仅为大家分享Plant Simulation新老版本中随机数的3条使用建议。
1 随机数复位
随机数复位指的是什么?举个简单的例子:例如一个仿真模型中含有随机设置,比如随机加工、故障、切换时间等,然后进行多次独立的仿真实验。如果进行了随机数复位设置,那么每次实验结果和过程是完全一样的;如果没有进行随机数复位,那么每次实验结果和过程将不同。软件默认设置随机数复位,如果需要更改设置,可以编写代码(老版本:EventController.SeedReset:=true/false;新版本:EventController. IncrementRandomNumbersVariantOnReset:=true/false;)或快捷选项参考下图:
2 种子值(seed value)
新老版本随机数算法在种子值方面有很大的区别,老版本随机数算法需要两个种子值,新版本只需要一个,新老版本的种子值设置列表如下图:
老版本:在老版本中如果没有特殊的需求,基本不用人为设置种子值。在编写分布函数程序(例如:z_uniform(stream,start,stop))或者设置控件随机参数(例如:Source控件的物料生成间隔服从某种概率分布)时,只需指定随机数流编号,系统会根据随机数流编号,在上图的列表中寻找相应的种子值。如果指定的随机数流编号超出列表所列范围,那么系统会按照编号顺序,自动生成缺少的所有种子值。
新版本:种子值的使用变化比较大。在编写分布函数程序时,与老版本基本一致,指定随机数流,系统在上图所示列表中根据随机数流编号找到对应的种子值。在控件中设置随机参数时,与老版本完全不同,新版本的控件自身带有种子值(可通过RandomSeed属性查询/设置),因此控件中不用设置随机数流,具体区别见下图。这样做的好处是可以为功能相同的两个控件设置相同的种子值,这样同一模型中就可以制作两个随机分布输出完全相同的两个控件,这在老版本中是做不到的。
由于新老版本的随机数算法种子值个数改变,也造成了一些问题。比如:用老版本软件建立带有实验管理器ExperimentManager的模型,用新版本软件不能正常运行,需要加载新的实验管理器并重新设置,类似这些问题是大家需要注意的。
3 随机数流(random number stream)
随机数流是相应种子值的编号,软件内部随机算法使用种子值生成随机数,但是我们在编程和控件设置的时候一般采用随机数流,系统会根据种子值列表自动对应。
总结:新版本还增加了Variant这样的功能,让我们可以在不改变当前随机设置的情况下,重复试验不同的随机输出。总之相比较老版本,功能更加的全面,设置也更加简单。但是具体的使用建议,比如:什么时候随机数不复位,什么时候设置控件自身种子值,等等这些疑问必须要结合具体的项目案例而定。