我可以在 Metapost 中查询随机种子的当前值吗?

我可以在 Metapost 中查询随机种子的当前值吗?

Metapost 允许您为随机数生成器设置种子,以便您可以从uniformdeviate和中获得可预测的数字序列normaldeviate

我可以像这样设置它:randomseed := 1234;就像任何其他参数或变量一样。但是当我尝试查询该值时,使用如下简单的程序:

show randomseed;
end.

我收到此错误:

! An expression can't begin with `randomseed'.

还有其他方法可以查询的当前值吗randomseed

答案1

抱歉,我回答了自己的问题,但我认为我最好记录下我的发现。

简短回答:不,您不能查询的默认值randomseed

较长的答案以及解决该问题的一种方法。

  1. 尽管你必须randomseed := 1234;以一种看起来像赋值的方式编写,但 Metapost 将其定义为命令而不是赋值,并且不提供任何查询当前值的方法。没有为随机种子提供用户空间变量名称。类似赋值的语法显然只是历史怪癖。

  2. 与 Metafontbook 中所述相反,MP 库中的默认值不是day+time*epsilon而是time/1+day。但是,对于命令行程序 ,此默认值在程序开始时被覆盖mpost
    执行此操作的代码位于 的第 520 行左右mpost.w,包含三个备选部分,具体取决于可用的系统时间函数。总之,该值是根据本地系统上可用的最高分辨率从当前时间设置的。因此,每次运行 MP 时它都会有所不同,而且很难预测。

  3. 这是一个对我有帮助的技巧:使用随机数设置自己的随机种子。

    如果在生成依赖于随机数的图表之前添加以下内容

    randomseed := uniformdeviate infinity;
    

    那么您每次都会得到不同的随机种子,但是由于您调用了该randomseed函数,因此使用的值将写入日志文件中,如下所示:

    {randomseed:=2772.6951}
    

    因此,您可以运行 MP 几次,直到您的随机图看起来恰到好处,然后您可以将随机种子的值从日志复制回您的程序中,以便您可以准确地重新创建它。

    请注意,如果您正在使用lualatex该包来生成 MP 图表,则仅当您将其添加到序言中luamplib时,MP 日志的内容才会包含在 tex 日志中。\mplibshowlog{enable}

相关内容