如何在APL中生成包含0-9和a-z的随机数组

时间:2018-03-12 17:27:33

标签: matrix random apl

?5 5⍴CHARS其中CHARS是包含0-z的变量。

roll操作符不会接受CHARS,因为它包含的元素不是非负整数,即字母a-z。

3 个答案:

答案 0 :(得分:3)

?5 5⍴nums其中nums是一个非负整数列表,可能无法提供您想要的内容,因为它会重新整形nums然后为每个整数进行滚动。实际上,你会5 5⍴(?nums[1])(?nums[2])(?nums[3]) ...

相反,我假设您希望5×5矩阵的每个元素包含随机的字符 0-9和a-z,替换。有关不同的假设,请参阅J. Sallé's excellent answer

正如J.Sallé所提到的,大写字母是⎕A,在Dyalog APL中,我们可以使用819⌶⎕A获得小写(819是mnemonic for "BIg"),而APLX有{{1} }。 Dyalog APL和APLX中的数字均为⎕a,因此所有36个可能的字符均为⎕Dsymbols←⎕D,819⌶⎕A。在其他APL系统上,您可能需要生成字符列表;见脚注。

我们可以使用symbols←⎕D,⎕a得到symbols的随机索引,最后我们进行实际索引以获得结果; indices←?5 5⍴36

Try it online!

作为一个单行,它是:

symbols[indices]

Try it online!

我们可以将它概括为一个效用函数,它将形状作为左参数,将元素列表作为右参数:

(⎕D,819⌶⎕A)[?5 5⍴36]

此处,{⍵[?⍺⍴≢⍵]} 是元素的数量,≢⍵是形状。这适用于许多系统(例如Dyalog,GNU和ngn)。 Try it online!以下内容适用于所有系统:

Try it online!

如何在任何APL系统上生成字符列表:

∇ array←shape Random data
  array←data[?shape⍴⍴data]
∇

⎕AV[∊-⎕IO-(⍳¨10 26)+⎕AV⍳'0a'] ... ⎕AV[ A tomic V ector(字符集)编入索引:

]指数“0”和“a”那里

⎕AV⍳'0a' ... (将以下内容添加到:

)+前10个和前26个指数

如果⍳¨10 26 ndex O rigin)为1,则

-⎕IO-减去1,因为⎕IO与{相同{1}}

-(1-x) ε nlist(展平将两个角色向量合并为一个)

Try it online!

答案 1 :(得分:1)

如果我理解你的问题,你想要一个5×5的0-z字符矩阵,那么让我们一块一块地做:

首先,我们创建一个字符向量CHARS←⎕A。请注意,此向量包含大写字母。如果你想要小写,你需要使用I-Beam操作819,chars←819⌶⎕A

然后,由于您需要数字0-9,我们需要手动将它们添加到chars向量中,或者使用⎕IO←0,这就是我在这种情况下要做的事情。因此,在我们的Index Origin设置为0的情况下,我们通过执行chars,←⍳10将数字0-9添加到向量中。变量chars现在返回abcdefghijklmnopqrstuvwxyz 0 1 2 3 4 5 6 7 8 9

最后,我们需要随机选择这些元素来填充矩阵。要对数字和字符的混合向量执行此操作,我们将随机选择其索引而不是滚动向量: chars[?≢chars]将滚动向量的随机元素。由于我们需要的不仅仅是一个元素,因此我们将使用chars[?(≢chars)⍴≢chars]。这将滚动≢chars,即36,向量的随机元素。

在这之后,我们将其重塑为5×5矩阵。我们的最终代码是5 5⍴chars[?(≢chars)⍴≢chars]

如果您愿意,可以在这个方便的网站上逐步查看:

Try it Online!

答案 2 :(得分:0)

岂不

'abcdefghijklmnopqrstuvwxyz0123456789'[5 5⍴36?36](5 x 5数组中的唯一字符)

'abcdefghijklmnopqrstuvwxyz0123456789'[?5 5⍴36](可能重复的字符)

做到了吗?任何来源的作品,应该适用于每个APL。