聊一聊关于随机数的生成

  • 14 October 2022
  • 1 reply
  • 134 views

Userlevel 5
Badge +3

最近碰到的关于随机数的问题蛮多的,加上最近一直在忙接下来要发的22.3的版本说明的翻译,这周就不做日文帖子的翻译了,写一点总结吧。


1 reply

Userlevel 5
Badge +3

据说,叙述先要抛个问题出来,会比较有吸引力。

那么问题来了,你知道为什么我们用RCWA跑出来的AR光波导仿真,探测器跟评价函数得到的数值不一样吗?是怎么做到探测器的数值一直在变化,但是评价函数的数值纹丝不动的?

欲知后事如何,且听下回,啊,不是,是下文分解。

关于这个问题的始末可以在以下帖子中找到详细的始末。

关于如何使用Zemax的RCWA工具进行EPE的仿真 | Zemax Community

原因就是,勾选了随机偏振。具体就不展开细说了,找问题的过程都是泪。

故事讲完进入正题,来说说随机数的生成。

随机数在做公差分析的时候出场概率还是可以的。对应的numeric function是RAND。RAND(x)的这个x就是表示了随机数的上限,大部分的时候都出不了这个数字(这是句废话,我知道,我就是想皮一下)。

大家可以去帮助文档下面的这个路径找到关于它的更多解释,这边不搬运图片了。说不定你刷着刷着,就有了新的收获。

The Programming Tab > About the ZPL > Numeric Functions

说到Rand,我就想到了公差脚本的Perturb。

The Tolerance Tab > Tolerancing Overview > Using Tolerance Scripts > The Tolerance Script Commands

如果只是做公差,你会发现公差脚本比较快,毕竟宏是单线程的。能用公差脚本做,就不要用宏。不过如果要做一些简单的数据处理的话,那还是需要用到宏。我个人觉得最快学习的方法是读下面这篇文章,然后拿里面的例子做改动。如果你发现篇文章很好用,帮我推广一下论坛呗。

How to open consecutively-named lens files using a ZPL macro – Knowledgebase (zemax.com)

跑题了,回来继续说随机数的问题。

我们可以在这个话题里面找到一些介绍资料。

The Programming Tab > About the ZPL > KEYWORDS (about the zpl) > RANDOMIZE

RANDOMIZE seeds the random number generator.

Syntax:

RANDOMIZE seed

If seed evaluates to zero, OpticStudio seeds the random number generator with a value based upon the CPU clock. Otherwise, the value provided is used to seed the random number generator. Using the same seed will reproduce the identical series of random numbers created by the RAND function.

系统生成的是伪随机数,所以这里有一个所谓的随机数种子的概念。如果每次输入的种子数相同,那么每次出来的结果就都是一样的。具体测试的话看我的Macro。

如果你好奇随机数的生成原理,可以参考一下下面这篇文章。

【C++】随机数生成原理 - 知乎 (zhihu.com)

然后说回来这个Randomize,如果希望每次的随机数序列是一样的,那就指定同一个随机数种子。有没有好奇为什么会有每次随机数序列一样的需求?针对同一个系统,不同的随机数种子会带来不同的仿真结果,这对于优化是一个极强的干扰项。这是为什么在优化的过程中我们会固定一个随机数种子,也是为什么开头设置随机偏振之后的评价函数结果不改变的原因。

上面说的这一段,在NSTR的说明书里面有提到,优化的时候建议选择非0随机数种子。

The Programming Tab > About the ZPL > KEYWORDS (about the zpl) > NSTR

上面有提到,如果随机数种子是0的话,就会根据系统时间生成随机数,这样的话就可以保证每次的随机数不一样了,做公差分析想去生成一些干扰,或者跑仿真的时候想看看不同随机数带来的偏差的话,就可以选择这个选项。想测试的可以把我上面写的那个宏改着玩。

这里补充我最近发现的知识点,有个string function叫做$DATE,很有意思,这样就可以按照时间生成自己的随机数种子。

Returns the current date and time string. The formatting is specified by the Date/Time control settings in the General section of the Project Preferences.

先讲这些吧,后面想到什么再补充。

Reply