In reply to Brian Hare.

For sampling without replacement, the RANUNI function has a distinct advantage: it will never repeat a number until it is called 2^31 times, so you don't need to worry about adjusting the probabilities in the loop. You can simply write a DO loop:

%let SampSize = 1e5;
data sample;
do i = 1 to &SampSize;
Row = N*ranuni(1);
set Have point=Row nobs=N; * Jump to desired row. Read desired row;
output; * Output desired row;
end;
stop;
run;

For sampling WITH replacement, use PROC SURVEYSELECT or the RAND function.