如何在PostScript中生成随机字符字符串?rand函数异常排查
PostScript随机字母字符串生成问题解决
问题根源
- 随机种子重复:你每次绘制一行前都调用
realtime srand,但代码执行速度极快,连续调用realtime会返回相同的时间戳,导致随机种子完全一致,rand生成的序列自然重复,所以后两行内容和第二行完全相同。 - 字符拼接冗余:当前循环5次逐个
show字符的方式虽然能输出结果,但可以更高效地拼接成完整字符串再输出。
修正方案
- 单次初始化随机种子:把
realtime srand放在代码最开头,整个文档只初始化一次随机序列,确保每次调用rand都能获取不同的随机值。 - 封装生成函数:编写专用函数生成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
相关产品推荐
相关产品推荐

