# CALL RANCOMB Routine

Permutes the values of the arguments, and returns a random combination of k out of n values.

 Category: Combinatorial

## Syntax

CALL RANCOMB(seed, k, variable-1 );

### Required 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 combination.

#### variable

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

## Details

### The Basics

If there are n variables, CALL RANCOMB permutes the values of the variables in such a way that the first k values are sorted in ascending order and form a random combination of k out of the n values. That is, all n!/(k!(n-k)!) combinations of k out of the n values are equally likely to be returned as the first k values.
If an error occurs during the execution of the CALL RANCOMB 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.

### Using CALL RANCOMB with Macros

You can call the CALL RANCOMB routine when you use the %SYSCALL macro. In this case, the variable arguments are not required to be the same type or length. However, if the first k values that are returned include both character and numeric values, then those values are not sorted. If %SYSCALL identifies an argument as numeric, then %SYSCALL reformats the returned value.

## Examples

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

The following example shows how to generate random combinations of given values by using the CALL RANCOMB routine.
```data _null_;
array x x1-x5 (1 2 3 4 5);
seed = 1234567890123;
do n=1 to 10;
call rancomb(seed, 3, of x1-x5);
put seed= @20 ' x= ' x1-x3;
end;
run;```
Log Output from Using the CALL RANCOMB Routine in a DATA Step
```seed=1332351321     x= 2 4 5
seed=829042065      x= 1 3 4
seed=767738639      x= 2 3 5
seed=1280236105     x= 2 4 5
seed=670350431      x= 1 2 5
seed=1956939964     x= 2 3 4
seed=353939815      x= 1 3 4
seed=1996660805     x= 1 2 5
seed=1835940555     x= 2 4 5
seed=910897519      x= 2 3 4
```

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

The following is an example of the CALL RANCOMB 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 rancomb(seed, k, x1, x2, x3, x4, x5);
%put j=&j   &x1 &x2 &x3;
%end;
%mend;

%test;```
SAS writes the following output to the log:
```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
```