如何从 postscript 中的 REALTIME 运算符获取大整数值?毫秒?

问题描述 投票:0回答:1

REALTIME 运算符应该以毫秒为单位输出时间。 我想用它作为 RAND 的种子,但输出始终是 24 到 31 之间的两位数。我是如何误解实时运算符的?有没有我在红、绿、蓝参考书中找不到的替代方案? 我正在使用 Linux (ubuntu 22) Ghostscript gs --版本 9.55.0

代码

%!PS
/inch {72 mul} def
/Times-Roman findfont 15 scalefont setfont
1 inch 10 inch moveto
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

/str6 200 string def
/rrr {realtime} def
rrr 100000 mul  str6 cvs  show
(   ) show

/str6 200 string def
/rrr {realtime} def
rrr 100000 mul  str6 cvs  show
(   ) show

/str6 200 string def
/rrr {realtime} def
rrr 100000 mul  str6 cvs  show
(   ) show

/str6 200 string def
/rrr {realtime} def
rrr 100000 mul  str6 cvs  show
(   ) show

/str6 200 string def
/rrr {realtime} def
rrr 100000 mul  str6 cvs  show
(   ) show

/str6 200 string def
/rrr {realtime} def
rrr 100000 mul  str6 cvs  show
(   ) show

showpage

%   OUTPUT IS ALWAYS A 2 DIGIT INT WITH 5 NOUGHTS
%
%   2700000  2700000  2700000  2700000  2700000  2700000  
%
time postscript random-seed milliseconds system-clock
1个回答
0
投票

使用从 Git 存储库的当前 HEAD 构建的二进制文件,

realtime
运算符不会为我返回 24 到 31 之间的值,我会得到一个稳定增加的值。

Ubuntu 软件包维护者可能改变了

realtime
的操作,或者在过去 3 年里发生了一些变化。尝试从当前源代码构建,您将需要 C 编译器(gcc 或 clang)GNU make 和 autotools。

不要使用 cvs 和 show 在输出上打印值,而是尝试使用

realtime ==
它将结果发送到后台通道。您可以通过交互式 PostScript 提示来执行此操作。

您不需要继续定义字符串,您应该使用堆栈。事实上,您不需要像现在一样在 systemdict 中不断定义键/值对。

例如您的代码:

/str6 200 string def
/rrr {realtime} def
rrr 100000 mul  str6 cvs  show
(   ) show

可以写成:

realtime
100000 mul
100 string cvs
show

你可以把它写成一个函数:

/print_realtime
{
    realtime
    100000 mul
    100 string cvs
    show
} bind def

所有这些都在没有定义

str6
rrr
的情况下完成,更不用说不断地重新定义它们了。

在大多数 PostScript 解释器上,乘以 100000 很快就会耗尽整数值。

请注意 PLRM 表示:

“实时值表示的时间单位是一毫秒。但是,其变化的速率取决于实现。”

所以从技术上来说它根本不需要改变。您可能最好使用用户时间,尽管这可能只跟踪处理器执行时间。

如果我没记错的话,Linux 上的 Ghostscript 对这两个函数都使用 gettimeofday。

© www.soinside.com 2019 - 2024. All rights reserved.