Metapost 允许您为随机数生成器设置种子,以便您可以从uniformdeviate
和中获得可预测的数字序列normaldeviate
。
我可以像这样设置它:randomseed := 1234;
就像任何其他参数或变量一样。但是当我尝试查询该值时,使用如下简单的程序:
show randomseed;
end.
我收到此错误:
! An expression can't begin with `randomseed'.
还有其他方法可以查询的当前值吗randomseed
?
答案1
抱歉,我回答了自己的问题,但我认为我最好记录下我的发现。
简短回答:不,您不能查询的默认值randomseed
。
较长的答案以及解决该问题的一种方法。
尽管你必须
randomseed := 1234;
以一种看起来像赋值的方式编写,但 Metapost 将其定义为命令而不是赋值,并且不提供任何查询当前值的方法。没有为随机种子提供用户空间变量名称。类似赋值的语法显然只是历史怪癖。与 Metafontbook 中所述相反,MP 库中的默认值不是
day+time*epsilon
而是time/1+day
。但是,对于命令行程序 ,此默认值在程序开始时被覆盖mpost
。
执行此操作的代码位于 的第 520 行左右mpost.w
,包含三个备选部分,具体取决于可用的系统时间函数。总之,该值是根据本地系统上可用的最高分辨率从当前时间设置的。因此,每次运行 MP 时它都会有所不同,而且很难预测。这是一个对我有帮助的技巧:使用随机数设置自己的随机种子。
如果在生成依赖于随机数的图表之前添加以下内容
randomseed := uniformdeviate infinity;
那么您每次都会得到不同的随机种子,但是由于您调用了该
randomseed
函数,因此使用的值将写入日志文件中,如下所示:{randomseed:=2772.6951}
因此,您可以运行 MP 几次,直到您的随机图看起来恰到好处,然后您可以将随机种子的值从日志复制回您的程序中,以便您可以准确地重新创建它。
请注意,如果您正在使用
lualatex
该包来生成 MP 图表,则仅当您将其添加到序言中luamplib
时,MP 日志的内容才会包含在 tex 日志中。\mplibshowlog{enable}