在 PostScript 中按区间生成随机数

Generate random number in interval in PostScript

我正在努力寻找一种在 PostScript 中的给定间隔内生成随机数的方法。

基本上 PostScript 具有三个函数来帮助您生成(伪)随机数。它们是 randsrandrrand

后两个用于将种子传递给数字生成器以便能够重现特定结果。至少那是我所理解的。无论如何,它们似乎不适合我的情况。

所以 rand 似乎是我可以用来生成随机数的唯一函数,但是...

rand returns a random integer in the range 0 to 231 − 1
(来自 the PostScript Language Reference, 第 637 页(PDF 中的 651))

这远远超出了我寻找的区间。我更感兴趣的是小到几千的值,可能是 10.000 或类似的值,小的浮点值,大到 100,下限都是 0。

我认为我可以通过简单的除法和提取根来缩小我的数字,但在很多情况下这往往会给我无法使用的小值。我想知道是否有可靠的方法可以将大量数字缩小到我需要的数量,或者我更喜欢只在所需间隔内生成数字。

此外:在 PostScript 中不可能使用 while 循环,否则我会编写一个函数来生成数字,直到它们适合我的区间。

关于如何将数字分解为我的区间有什么提示吗?

只需使用模运算符将其缩小到您想要的大小:

GS>rand 100 mod stack
7

mod 通常足够好而且速度很快。但是您可能会通过使用 floating-point ops 获得更均匀的分布。

rand 16#7fffffff div 100 mul cvi

这是因为mod丢弃了输入的高位。并且 PRNG 通常会尝试随机化所有位。通过缩小然后放大,它们都以舍入效果的方式贡献了一些东西。