如何在APL中生成含0-9与a-z的随机数组?解决roll运算符报错问题
解决APL中生成包含数字0-9和小写字母a-z的随机数组问题
你遇到的问题很典型——APL的?(roll)运算符确实只接受非负整数作为右操作数,因为它本质是生成索引值,而非直接处理字符。不过我们可以换个思路:先构造包含目标字符的向量,再用roll生成随机索引,最后通过索引取出字符。
具体实现步骤
- 定义字符集向量
首先我们需要把0-9和小写a-z整合成一个字符向量。APL提供了便捷的内置符号来简化这个过程:
CHARS ← ⎕D, ⎕C 'LOWER' ⎕A
⎕D是内置的数字字符向量'0123456789'⎕A是大写字母向量'ABCDEFGHIJKLMNOPQRSTUVWXYZ',⎕C 'LOWER'用来把它转成小写- 逗号
,用来拼接两个向量,最终CHARS就是包含36个字符的目标集合。
如果你所在的APL环境不支持⎕C,也可以直接手动定义:
CHARS ← '0123456789abcdefghijklmnopqrstuvwxyz'
- 生成随机字符数组
接下来用roll生成随机索引,再通过索引从CHARS中取字符:
result ← CHARS[?5 5⍴≢CHARS]
≢CHARS用来获取字符集的长度(这里是36),用它代替硬写的36会更灵活——如果以后修改字符集,不需要手动调整数字。?5 5⍴≢CHARS生成一个5×5的数组,每个元素是1到36之间的随机整数(也就是CHARS的有效索引)。- 最后用
CHARS[索引]取出对应位置的字符,得到你需要的随机字符数组。
示例输出
运行上述代码后,你可能会得到类似这样的结果(每次运行都会不同):
7 z 2 p k a 5 d 9 m 0 q s b 3 r 1 f u t c y 4 g n
为什么原方法不行?
再解释下你最初尝试的?5 5⍴CHARS失败的原因:APL的?运算符要求右操作数必须是非负整数数组——当你给它字符数组时,它无法识别这些非整数元素,自然会报错。我们的方法绕开了这个限制,让roll只处理整数索引,再通过索引映射到字符。
内容的提问来源于stack exchange,提问作者Richard Adams
相关产品推荐
相关产品推荐

