Rounded random numbers with fixed sum

조회 수: 18 (최근 30일)
Thomas Coppin
Thomas Coppin 2020년 8월 10일
댓글: Thomas Coppin 2020년 8월 10일
I'm trying to generate a 1xK array with 'random' numbers that sum to 1, but that are also rounded to either 1 or 2 decimal places.
For example, if K=3, and I want the numbers to 2 decimal places, this is what I would expect:
array = [0.27, 0.45, 0.27].
So far I am unable to achieve this. Here is my code.
K = 3;
r = rand(1,K);
r = round(r/sum(r),2);
Without rounding the numbers sum to 1, but once rounded the numbers only to sum to 1 approximately 50% of the time.
Any help would be greatly appreciated, thanks!
  댓글 수: 2
madhan ravi
madhan ravi 2020년 8월 10일
sum(array) is not exactly one?
Thomas Coppin
Thomas Coppin 2020년 8월 10일
No, once you round the values (after dividing by the sum) they no longer sum to exactly one.

댓글을 달려면 로그인하십시오.

답변 (2개)

Walter Roberson
Walter Roberson 2020년 8월 10일
편집: Walter Roberson 2020년 8월 10일
Multiply your desired total by 10 to the number of digits you need. Generate using Roger's code. Divide everything by 10 to the number of digits you need.
The sum of these will not in general be exactly the required value due to round off when adding floating-point numbers. In the test I just did of 1000 integers from 1 to 999, sum(v) /10 was different than sum(v/10) by 2*eps() of the value.

Bruno Luong
Bruno Luong 2020년 8월 10일
k = 3;
r = (diff([0 sort(randperm(100+k-1,k-1)) 100+k])-1)/100
  댓글 수: 4
Bruno Luong
Bruno Luong 2020년 8월 10일
편집: Bruno Luong 2020년 8월 10일
No but you can use Roger's RANDFIXEDSUM
k = 3;
x = round([0; cumsum(randfixedsum(k, 1, 100, 0, 0.5*100))]);
x(end) = 100; % prevent floating point error
r = diff(x')/100
The distribution might be not perfectly uniform but possibly close enough and suitable for what ever you want to do with it.
Thomas Coppin
Thomas Coppin 2020년 8월 10일
Thanks Bruno, that does exactly what I require.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Creating and Concatenating Matrices에 대해 자세히 알아보기

제품


릴리스

R2019b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by