*! version 1.01, Ben Jann, 06jul2004

program define sortlistby, rclass
	version 8.2
	syntax anything [, by(numlist) Random Asis Noisily ]

	if ("`by'"!=""&"`random'"!="")|("`by'"==""&"`random'"=="") {
		di as error "specify either by() or random (but not both)"
		exit 198
	}
	if "`asis'"=="" {
		numlist "`anything'"
		local anything `r(numlist)'
	}
	local n: word count `anything'
	if "`by'"!="" {
		if `n'!=`: word count `by'' {
			di as error "unmatched number of elements"
			exit 198
		}
	}
	local N=_N
	if `N'<`n' qui set obs `n'
	tempvar rank By
	qui gen `rank'=_n in 1/`n'
	if "`by'"!="" {
		qui gen double `By'=.
		forv i=1/`n' {
			qui replace `By'=`: word `i' of `by'' in `i'
		}
	}
	else qui gen double `By'=uniform() in 1/`n'
	sort `By' in 1/`n'
	forv i=1/`n' {
		local list `"`list'`: word `=`rank'[`i']' of `anything'' "'
	}
	sort `rank' in 1/`n'
	if `N'<`n' qui drop in `=`N'+1'/`n'
	local list: list retok list
	ret local list `"`list'"'
	if "`noisily'"!="" di `"`list'"'
end