bucketing values
Show older comments
Hi
I have a vector of values from 0 to 1 representing probabilities
A = [0.8756 0.1185 0.0059]
How can i generate a random number using rand() and map it to a value in A without looping. I can;t see how i can do this with vectorisation or with the built in functions.
My aim is generate a random numbers so 87% of the time I choose A(1), 11% A(2), etc...
Thanks
Accepted Answer
More Answers (5)
Daniel Shub
on 21 Jul 2011
Assuming your array A is short ...
A = [0.8756 0.1185 0.0059]
x = rand(1e3, 1);
y(x < A(1)) = 'a';
y(x >= A(1) & x < A(2)) = 'b';
y(x >= A(2)) = 'c';
2 Comments
Fangjun Jiang
on 21 Jul 2011
I think all the answers provided are along the same line. In your case, the A needs to be [0.87,0.98,1].
Daniel Shub
on 21 Jul 2011
You are correct. I was sloppy.
Sean de Wolski
on 21 Jul 2011
Like this?
A = [0.8756 0.1185 0.0059]; %percentiles (must sum to 1
R = rand(1,1000); %random data
B = [11 17 19]; %sample data to extract A% of the time
[junk,Bin] = histc(R,[-inf cumsum(A)]); %find the bin
C = B(Bin) %extract
Fangjun Jiang
on 21 Jul 2011
Something like this:
A = [0.8756 0.1185 0.0059];
RandNum=rand(1000,1);
Index=2*ones(size(RandNum));
Index(RandNum<A(1))=1;
Index(RandNum>1-A(3))=3;
sum(Index==1)
sum(Index==2)
sum(Index==3)
ans =
892
ans =
102
ans =
6
close enough?
Greg
on 21 Jul 2011
0 votes
1 Comment
Sean de Wolski
on 21 Jul 2011
Randsample and Histc are both automated for large/varying A.
Greg
on 21 Jul 2011
0 votes
Categories
Find more on Logical in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!