1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
* (Вопрос) Нужен макрос, в который передаётся 5 параметров:
	исходное состояние датчика случайных чисел (seed)
	количество требуемых целых чисел для отбора
	наименьшее целое число
	наибольшее целое число
	приращение целых чисел (по умолчанию 1)
	и возвращает случайно отобранные целые числа.
	
*	Список чисел должен печататься по 10 в строке (с разрывом между 5-м и 6-м числами) 
	a) в порядке отбора и b) в порядке возрастания чисел.

* (Ответ) Ответ размещён в SPSSX-L, автор: rlevesque@videotron.ca, 14.08.2001.
* http://www.spsstools.net

* Макрос печатеи (!print) будет вызван из главного макроса. Вам необходимо выбрать один из двух методов печати 
	и удалить другой. При использовании второго метода убедитесь, что в настройках программы 
	установлено отображение лога (журнальных записей).
* Два примера использования макросов даны в конце кода.

*//////////////////////////////.
DEFINE !print()
vector id(10F6.0).
compute idx=mod(selorder,10).
if idx=0 idx=10.
compute id(idx)=id.
compute linenb=trunc(selorder/10.1)+1.

AGGREGATE
  /OUTFILE=*
  /BREAK=linenb
  /id1 TO id10 = FIRST(id1 TO id10).

* используйте один из методов вывода результатов.
* ...через команду summarize.
string space(A1).
variable label space ' '.
SUMMARIZE
  /TABLES=id1 to id5 space id6 to id10
  /FORMAT=VALIDLIST NOCASENUM TOTAL
  /TITLE='Отобранные наблюдения'
  /MISSING=VARIABLE
  /CELLS=NONE.

* ...через команду print.
print /id1 id2 id3 id4 id5 '    ' id6 id7 id8 id9 id10.
execute.
!ENDDEFINE.
*//////////////////////////////.


*/////////////////////////////.
DEFINE !getlist (seed=!TOKENS(1) 
	/nbreq=!TOKENS(1)
	/min=!TOKENS(1)
	/max=!TOKENS(1)
	/incr=!TOKENS(1) !DEFAULT(1))
set seed=!seed.  
input program.
loop #1 = !min to !max by !incr. 
compute ranorder= rv.normal(0,1).
compute id= #1.
end case.
end loop.
end file.
end input program.
formats ranorder (f8.6).
sort cases by ranorder.
compute selorder= $casenum.
formats id selorder (f6).
select if $casenum LE !nbreq.
print /selorder id.
save outfile='c:\\temp\\all cases.sav'.

* печатаем результаты в порядке отбора.
!print.

get file='c:\\temp\\all cases.sav'.
sort cases by id.
compute selorder=$casenum.
* печатаем результаты в порядке идентификационных номером (id).
!print.

!ENDDEFINE.
*/////////////////////////////.


* Пример 1.
!getlist seed=66754798 nbreq=50 min=100 max=200 incr=2.

* Пример 2 (использующий значение incr по умолчанию).
!getlist seed=12345678 nbreq=60 min=100 max=200.