There are a lot of ways to do this, but the hash table lookup is one of the most straightforward.
%let meannorm=5;
%let stDevNorm=1;
%let numRuns=10000;
/* this is the pre-computation step, building CompressArray for later use */
data my_values;
call streaminit(7);
do i = 1 to &numRuns;
Value= rand('Normal',&meannorm., &stDevNorm.);
output;
end;
run;
data reportData;
if _n_=1 then do;
declare hash h(dataset:'my_values');
h.defineKey('i'); *the "key" you are looking up from;
h.defineData('value'); *what you want back;
h.defineDone();
call missing(of i value);
end;
set sashelp.class; /* 100K+ observations on 30+ vars */
array outputValues[10000];
do i = 1 to &numRuns;
rc=h.find();
outputValues[i] = value;
end;
run;
Basically, you need to 'load' the table in some fashion and do [something] with it. Here's one easy way.
In your particular example there's another pretty simple way: bring it in an as array.
In this case we don't put 10k rows out, but 10k variables - then declare it as an array (again) in the new data step. (Arrays are, as noted by user667489, transient; they're not stored on the dataset in any way, except as the underlying variables, so they have to be re-declared each data step.)
%let meannorm=5;
%let stDevNorm=1;
%let numRuns=10000;
/* this is the pre-computation step, building CompressArray for later use */
data my_values;
call streaminit(7);
array values[&numruns.];
do i = 1 to &numRuns;
Values[i]= rand('Normal',&meannorm., &stDevNorm.);
end;
run;
data reportData;
if _n_=1 then set my_values(drop=i);
set sashelp.class; /* 100K+ observations on 30+ vars */
array outputValues[&numruns.];
array values[&numruns.]; *this comes from my_values;
do i = 1 to &numRuns;
outputValues[i] = values[i];
end;
drop values:;
run;
Here note that I have the set in if _n_=1
still - otherwise it would terminate the data step after the first iteration.
You could also use a format, as Reeza notes, or several other options - but I think these are the simplest.