The methods listed above will not give you exactly that binary proportion, but very close to it. This is what I use to get almost exactly the desired proportion for 0/1. The idea is to track the actual proportion generated so far and to "wiggle" the probability to compensate. %let prob1 = 0.2345; %let size = 100000; data want; if _n_ = 1 then do; retain _need1 _remain; _need1 = &prob1 * &size; * number of 1 needed, replace with a number if you like; _remain = &size; * remaining number of records; end; do _i = 1 to &size; x4 = ( ranuni( 12345 ) <= ( _need1 / _remain ) ); output; if x4 then _need1 = _need1 - 1; * if is 1, need 1 less 1; _remain = _remain - 1; * have 1 less record left; end; drop _remain _need1 _i; run; proc means; run; This generates exactly the desired proportion, almost without fail. If you have an input dataset, try some variation of this: %let prob1 = 0.2345; data want; set have nobs=_tot; if _n_ = 1 then do; retain _need1 _remain; _need1 = &prob1 * _tot; * number of 1 records needed, replace with a number if you like; _remain = _tot; * remaining number of records; end; x4 = ( ranuni( 12345 ) <= ( _need1 / _remain ) ); if x4 then _need1 = _need1 - 1; * if is 1, need 1 less 1; _remain = _remain - 1; * have 1 less record left; drop _remain _need1; run; Often this idea is used in sampling as well to get exactly the desired proportion. A bit of work can extend it to stratified sampling. Just have to keep more counters and adjust appropriately.
... View more