打印在APL中两个数字之间的值如何?

huangapple go评论70阅读模式
英文:

how to print values between 2 numbers in APL?

问题

我无法打印从30到50(包括30和50)的数值在APL中。

实际上,我尝试了很多运算符,但都没有奏效。

英文:

I am not able to print values ranging from 30 to 50 both inclusive in APL.

Actually I tried so much operators but not working.

答案1

得分: 2

以下是翻译好的部分:

你的约束是什么?你想定义一个函数吗,还是只想知道如何迭代?"print" 是指返回结果还是字面上打印到某个地方(输出/文件)?

在最简单的方式中,使用 iota 来迭代两个边界之间的距离,然后将较低的一个加到结果中。假设索引起点 IO 设置为 0

    30 + 21
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

如果 IO 设置为 1,则减小较低的边界:

    29 + 21
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

您可以随时检查或设置 IO,使用 ⎕IO 来切换:

    ⎕IO  0
0
英文:

What are your constraints? Do you want to define a function or do you just want to know how to iterate? Does "print" mean return as result or literally print to somewhere (output/file)?

In the easiest way, use iota to iterate through the distance between the two bounds, then add the lower one to the results. Assuming index origin IO is set to 0:

    30 + 21
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

If IO is set to 1, lower the lower bound:

    29 + 21
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

You can always inspect or set IO using ⎕IO if you wanted to switch:

    ⎕IO  0
0

答案2

得分: 1

Sure, here is the translated content:

"实际上,我想要打印出在8到30之间的随机12个值。

如果⎕IO设置为1,你可以使用?23(或?1+30-8)生成大于或等于1且小于或等于23的随机整数。然后,将结果加上7(或8-1),它将在8到30之间,包括这两个值:7+?23(如果⎕IO设置为0,生成的随机数将范围从022,因此要达到目标范围,你需要加上8而不是7,或者如果需要独立于⎕IO的通用性,可以加上(8-⎕IO))。

现在,要从该范围内抽取多个随机数,请在其左参数中使用?并提供你想要查看的抽取数量。结果将是一个具有相同长度的数组。

      7+12?23
23 21 9 8 10 27 12 30 28 19 26 14

请注意,这些数字都是唯一的(没有重复)。如果要获得一个包含独立的随机数字的数组(值可以多次抽取),请使用来相应地调整?的(右)参数,然后将其应用于整个数组:

      7+?1223
9 8 30 16 13 25 26 8 26 19 19 18

"

英文:

> Actually I wanted to print random 12 values between 8 to 30.

If ⎕IO is set to 1, you can generate a random integer larger or equal to 1 and smaller or equal to 23 using ?23 (or ?1+30-8). Then, add 7 (or 8-1) to the result, and it will be shifted between 8 and 30, both inclusive: 7+?23. (With ⎕IO set to 0, the generated random number will instead range from 0 to 22, so to reach the destination range you'd have to add 8 rather than 7, or (8-⎕IO) more generically if independence from ⎕IO is a concern.)

Now, to draw more than one random number from that range, provide ? in its left argument with the amount of draws you'd like to see. The result is an array of that length.

      7+12?23
23 21 9 8 10 27 12 30 28 19 26 14

Note that these numbers are all unique (no duplicates). To instead get an array of independent random numbers (values can be drawn more than once), use to accordingly reshape the (right) argument of ? which will then be applied onto the whole array:

      7+?1223
9 8 30 16 13 25 26 8 26 19 19 18

答案3

得分: 0

@pmf's solution是简单的,但在处理两个大但接近的值时可能效率很低,并且如果任何一个数是负数,它会失败。

如果我们将边界称为,那么⍺+¯1+⍳1+⍵-⍺既高效又通用。如果⎕IO为0,则移除¯1+。您可以使用以下公式创建一个to函数:

      to{(⍺-⎕IO)+¯1+⍳1+⍵-⍺}
      30 to 50
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

或者,如果您使用Dyalog APL,您可以使用dfns工作区中的to实用程序函数,如下所示:

      'to' ⎕CY 'dfns'
      30 to 50
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
英文:

@pmf's solution is simple, but can be very inefficient (for two large, but close values) and fails if any number is negative.

If we call the bounds and then ⍺+¯1+⍳1+⍵-⍺ is both efficient and general. Remove ¯1+ if ⎕IO is 0. You can create a to function using this formula as follows:

      to{(⍺-⎕IO)+¯1+⍳1+⍵-⍺}
      30 to 50
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

Alternatively, if you use Dyalog APL, you can use the to utility function from the dfns workspace, as follows:

      'to' ⎕CY 'dfns'
      30 to 50
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

huangapple
  • 本文由 发表于 2023年4月19日 17:46:31
  • 转载请务必保留本文链接:https://go.coder-hub.com/76053060.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定