2016-10-27 10 views
0

Ich weiß, wie man in Matlab Zufallszahlen in einem bestimmten Bereich erzeugt. Was ich jetzt versuche, ist Zufallszahlen in einem Bereich zu generieren, in dem es eine größere Chance gibt, bestimmte zu bekommen.Generieren von Zufallszahlen mit gewichteten Verteilung in Matlab?

Zum Beispiel: Wie könnte ich Matlab verwenden, um Zufallszahlen zwischen 0 und 2 zu generieren, wobei 50% von ihnen weniger als 0,5 sind?

Um Zahlen zwischen 0 und 2 zu bekommen, würde ich (2-0) * rand + 0 verwenden. Wie kann ich dies tun, aber einen bestimmten Prozentsatz der generierten Zahlen kleiner als 0,5 bekommen? Gibt es eine Möglichkeit, dies mit der Rand-Funktion zu tun? Hier

Antwort

1

ist ein Vorschlag:

N = 10; % how many random numbers to generate 
bounds = [0 0.5 1 2]; % define the ranges 
prob = cumsum([0.5 0.3 0.2]); % define the probabilities 
% pick a random range with probability from 'prob': 
s = size(bounds,2)-cumsum(bsxfun(@lt,rand(N,1),prob),2); 
% pick a random number in this range: 
b = rand(1,N).*(bounds(s(:,end)+1)-bounds(s(:,end)))+bounds(s(:,end)) 

Hier haben wir eine Wahrscheinlichkeit von prob(k) eine Zahl zwischen bounds(k)-bounds(k+1) zu ziehen. Grundsätzlich zeichnen wir zunächst einen Bereich mit definierter Wahrscheinlichkeit und zeichnen dann eine weitere Zahl aus dem Bereich. So sind wir nur an b interessiert, brauchen aber s unterwegs (hauptsächlich um vektoriell viele Zahlen zu erzeugen).

so erhalten wir:

b = 
    Columns 1 through 5 
     0.5297  0.15791  0.88636  0.34822  0.062666 
    Columns 6 through 10 
    0.065076  0.54618 0.0039101  0.21155  0.82779 

Oder für N = 100000 können wir ziehen:

hist

so können wir sehen, wie sich die Werte zwischen den drei Bereichen in bounds verteilt sind.

0

Sie können die Bereiche mit einer multinomialen Verteilung zeichnen und dann die Zufallszahlen berechnen. Hier ist, wie:

N = 10; 
bounds = [0 0.5 1 2]; % define the ranges 
d = diff(bounds); 
% pick a N random ranges from a multinomial distribution: 
s = mnrnd(N,[0.5 0.3 0.2]); 
% pick a random number in this range: 
b = rand(1,N).*repelem(d,s)+repelem(bounds(1:end-1),s) 

so erhalten Sie s:

s = 
    50 39 11 

die sagt, Sie nehmen 50 Werte aus dem ersten Bereich, 39 aus der zweiten, und so weiter ...

Und Sie erhielt das Ergebnis in b:

b = 
    Columns 1 through 5 
     0.28212  0.074551  0.18166  0.035787  0.33316 
    Columns 6 through 10 
     0.12404  0.93468  1.9808  1.4522  1.6955 

Also im Grunde ist es das gleiche wie die Tanne arbeitet st Methode, die ich hier gepostet habe, aber es kann genauer und/oder lesbar sein. Außerdem habe ich nicht getestet, welche Methode schneller ist.

Verwandte Themen