Functions and CALL Routines

# CALL RANPERK Routine

Randomly permutes the values of the arguments, and returns a permutation of k out of n values.
 Category: Combinatorial

## Syntax

 CALL RANPERK(seed, k, variable-1<, variable-2, ...>);

### Arguments

seed

is a numeric variable that contains the random number seed. For more information about seeds, see Seed Values.

k

is the number of values that you want to have in the random permutation.

variable

specifies all numeric variables, or all character variables that have the same length. K values of these variables are randomly permuted.

### Using CALL RANPERK with Macros

You can call the RANPERK routine when you use the %SYSCALL macro. In this case, the variable arguments are not required to be the same type or length. If %SYSCALL identifies an argument as numeric, then %SYSCALL reformats the returned value.

If an error occurs during the execution of the CALL RANPERK routine, then both of the following values are set:

• &SYSERR is assigned a value that is greater than 4.

• &SYSINFO is assigned a value that is less than -100.

If there are no errors, then &SYSERR and &SYSINFO are set to zero.

### Example 1: Using CALL RANPERK in a DATA Step

The following example shows how to generate random permutations of given values by using the CALL RANPERK routine.

```data _null_;
array x x1-x5 (1 2 3 4 5);
seed = 1234567890123;
do n=1 to 10;
call ranperk(seed, 3, of x1-x5);
put seed= @20 ' x= ' x1-x3;
end;
run;```

```seed=1332351321     x= 5 4 2
seed=829042065      x= 4 1 3
seed=767738639      x= 5 1 2
seed=1280236105     x= 3 2 5
seed=670350431      x= 4 3 5
seed=1956939964     x= 3 1 2
seed=353939815      x= 4 2 1
seed=1996660805     x= 3 4 5
seed=1835940555     x= 5 1 4
seed=910897519      x= 5 1 2```

### Example 2: Using CALL RANPERK with a Macro

The following is an example of the CALL RANPERK routine that is used with macros.

```%macro test;
%let x1=ant;
%let x2=-.1234;
%let x3=1e10;
%let x4=hippopotamus;
%let x5=zebra;
%let k=3;
%let seed = 12345;
%do j=1 %to 10;
%syscall ranperk(seed, k, x1, x2, x3, x4, x5);
%put j=&j   &x1 &x2 &x3;
%end;
%mend;

%test;```

```j=1   -0.1234 hippopotamus zebra
j=2   hippopotamus -0.1234 10000000000
j=3   hippopotamus ant zebra
j=4   -0.1234 zebra ant
j=5   -0.1234 ant hippopotamus
j=6   10000000000 hippopotamus ant
j=7   10000000000 hippopotamus ant
j=8   ant 10000000000 -0.1234
j=9   zebra -0.1234 10000000000
j=10   zebra hippopotamus 10000000000```

 Functions and CALL Routines:

 Previous Page | Next Page | Top of Page