University of Rochester Medical Center
SearchDirectoryNewsEventsStrong HealthURMC Home

SAS Helpful Hints

Biostat Macro Library

Generate a balanced list of random numbers from 1 to N.

Often used for generating treatment assignments.

%Macro randomlist(anary,ttemp,ssiz,rrange,sseed);
    * Create an array of sequential numbers (1->ssiz);
    * Create an array of random numbers;
    Do ii=1 To &ssiz;
        &anary{ii}=ii;
        Call Ranuni(&sseed,&ttemp{ii});
    End;
    * Sort the array of sequential numbers(anary) so that the
            random numbers appear to be in order;
    Do ii=1 To &ssiz-1;
        Do jj=ii+1 To &ssiz;
            If &ttemp{&anary{ii}}>&ttemp{&anary{jj}} Then Do;
                ttmp=&anary{ii};
                &anary{ii}=&anary{jj};
                &anary{jj}=ttmp;
            End;
        End; * jj;
    End; * ii;
    * The "sequential" numbers(anary) are now randomized;
    Do ii=1 To &ssiz;
        &anary{ii}=mod(&anary{ii},&rrange)+1;
    End;
%Mend randomlist;

%Let msize=6;
Data work.A;
    Retain stratas 10 size &msize range 3 seed 80800;
    Array randm{&msize};
    Array temp{&msize};
    id=200;
    Do strata=1 To stratas; * For each strata;
        %randomlist(randm,temp,size,range,seed);
        Do i=1 To size;
            id=id+1;
            treat=randm{i};
            Output work.A;
        End; * i;
    End; * stratas;
    Keep strata id treat;
    Label treat='Treatment';
Run;

 

Please send your comments and suggestions about this web page to A. Watts (watts@bst.rochester.edu)