Я не могу печатать значения от 30 до 50 включительно в APL.
На самом деле я пробовал так много операторов, но не работал.
Каковы ваши ограничения? Вы хотите определить функцию или просто хотите знать, как выполнять итерацию? Означает ли «печать» возврат в качестве результата или буквально печать куда-то (выход/файл)?
Самый простой способ — использовать 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
На самом деле я хотел напечатать случайные 12 значений от 8 до 30.
Решение @pmf простое, но может быть очень неэффективным (для двух больших, но близких значений) и дает сбой, если любое число отрицательное.
Если мы назовем границы ⍺
и ⍵
, то ⍺+¯1+⍳1+⍵-⍺
будет одновременно эффективным и общим. Удалите ¯1+
, если ⎕IO
равно 0. Вы можете создать функцию 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, вы можете использовать служебную функцию to из рабочей области dfns следующим образом:
'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
Что касается вашего первого решения, не будет ли to←{(⍺-⎕IO)+⍳1+⍵-⍺}
решать его независимо от ⎕IO
?
@JeffZeitlin Да, конечно, но я хотел, чтобы формула была простой. Однако я изменю определение функции.
На самом деле я хотел напечатать случайные 12 значений от 8 до 30.
Если для ⎕IO
установлено значение 1
, вы можете сгенерировать случайное целое число, большее или равное 1
и меньшее или равное 23
, используя ?23
(или ?1+30-8
). Затем добавьте 7
(или 8-1
) к результату, и он будет сдвинут между 8 и 30 включительно: 7+?23
. (Если для ⎕IO
установлено значение 0
, сгенерированное случайное число будет варьироваться от 0
до 22
, поэтому для достижения диапазона назначения вам придется добавить 8
, а не 7
, или (8-⎕IO)
в более общем смысле, если независимость от ⎕IO
вызывает беспокойство.)
Теперь, чтобы получить более одного случайного числа из этого диапазона, укажите ?
в его левом аргументе количество розыгрышей, которые вы хотели бы увидеть. В результате получается массив такой длины.
7+12?23
23 21 9 8 10 27 12 30 28 19 26 14
Обратите внимание, что все эти номера уникальны (без дубликатов). Чтобы вместо этого получить массив независимых случайных чисел (значения можно рисовать более одного раза), используйте ⍴
, чтобы соответствующим образом изменить форму (правого) аргумента ?
, который затем будет применен ко всему массиву:
7+?12⍴23
9 8 30 16 13 25 26 8 26 19 19 18
Указание того, какую реализацию и версию APL вы используете, поможет людям дать вам лучший ответ.