CALL RANPERK Routine

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

Category: Combinatorial

Syntax

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

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 permutation.

variable

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

Details

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.

Examples

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;
Log Output from Using the CALL RANPERK Routine in a DATA Step
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;
Log Output from Using the CALL RANPERK Routine with a Macro
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

See Also

Functions: