You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PostScript中生成随机字符字符串?rand函数异常排查

PostScript随机字母字符串生成问题解决

问题根源

  • 随机种子重复:你每次绘制一行前都调用realtime srand,但代码执行速度极快,连续调用realtime会返回相同的时间戳,导致随机种子完全一致,rand生成的序列自然重复,所以后两行内容和第二行完全相同。
  • 字符拼接冗余:当前循环5次逐个show字符的方式虽然能输出结果,但可以更高效地拼接成完整字符串再输出。

修正方案

  1. 单次初始化随机种子:把realtime srand放在代码最开头,整个文档只初始化一次随机序列,确保每次调用rand都能获取不同的随机值。
  2. 封装生成函数:编写专用函数生成5个随机字母组成的字符串,减少重复代码,逻辑更清晰。

修正后的完整代码

/inch {72 mul} def
/Times-Roman findfont 15 scalefont setfont

% 仅初始化一次随机种子
realtime srand

/letterArray [(A)(B)(C)(D)(E)(F)(G)(H)(I)(J)(K)(L)(M)(N)(O)(P)(Q)(R)(S)(T)(U)(V)(W)(X)(Y)(Z)] def

% 生成5个随机字母组成的字符串
/gen5Letters {
    5 string          % 创建长度为5的空字符串
    0 1 4 {           % 遍历字符串的0-4索引位
        exch          % 交换字符串与当前索引位置
        rand 26 mod letterArray get  % 获取随机字母
        put           % 将字母写入字符串对应位置
    } for
} def

% 第一行:6组随机字符串
1 inch 10 inch moveto
6 {
    gen5Letters show
    (   ) show  % 组间间隔
} repeat

% 第二行
1 inch 9 inch moveto
6 {
    gen5Letters show
    (   ) show
} repeat

% 第三行
1 inch 8 inch moveto
6 {
    gen5Letters show
    (   ) show
} repeat

showpage

关键改动说明

  • 随机种子优化:移到开头仅执行一次,彻底避免重复初始化导致的序列重复问题。
  • 字符串生成函数:通过5 string创建空容器,用put方法将随机字母写入对应位置,最后返回完整字符串,比逐个输出字符更高效,也方便后续复用。
  • 移除冗余定义:删除了原代码中每次循环都重复定义的/rrr,逻辑更简洁。

修改后输出的每一行、每一组字符串都会是完全随机的,不会再出现重复行的情况,字符拼接逻辑也更规范。

内容的提问来源于stack exchange,提问作者Molly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 13:34:59