Generating N random numbers that add to a TOTAL [message #89228] |
Wed, 06 August 2014 20:52  |
cgguido
Messages: 195 Registered: August 2005
|
Senior Member |
|
|
Hi all,
I am wondering if anybody has suggestions on how to improve the function below. It seems ok for floating precision numbers.
For integers it's a different story:
It works great if N<<TOTAL. When N approaches TOTAL I get a few numbers and then a bunch of zeros... Also, setting /DIFFERENT makes it run for ever if N is large. Also, the sum of res adds up TOTAL=/-1, not always to TOTAL exactly...
Suggestions?
Thanks,
Gianguido
FUNCTION nrndaddto, n, total, integers = integers, different = different
compile_opt idl2
res = dblarr(n)
res[0] = randomu(seed, 1, /double)*(total)
FOR i = 1, n-2 DO BEGIN
res[i] = randomu(seed, 1, /double)*(total-total(res[0:i-1], /double))
ENDFOR
res[n-1] = total-total(res[0:n-2], /double)
IF ~keyword_set(integers) THEN integers = 0
IF keyword_set(integers) THEN res = round(res)
IF keyword_set(different) THEN BEGIN
IF n_elements(res) NE n_elements(unique(res, /sort)) THEN res = $
nrndaddto(n, total, integers = integers, different = 1)
ENDIF
RETURN, res
END
|
|
|