2016-07-18 16 views
0

Ich schaue, um zu sehen, wie ich eine dreieckige Verteilung mit 3 Nummern von Minimum (40) Maximum (330) und Durchschnitt (100).Generieren Sie eine Zufallszahl mit max, min und Mittelwert (Durchschnitt) in visueller Basis - dreieckig dist

dieser Code gibt Sie mir nur den Zufall zwischen 2 Zahlen und trägt nicht den Durchschnitt:

z = =RAND()*(b-a)+a 

Wie kann ich es ein Dreieck dist machen. ?

+0

Sie können keine Dreiecksverteilung mit den drei angegebenen Werten generieren. Sie geben an, dass der Mittelwert 100 sein soll und "Mittelwert = (min + max + Modus)/3". Angesichts Ihrer Spezifikationen ergibt das Auflösen des Modus in 100 = (40 + 330 + Modus)/3 einen Wert von -70, der nicht zwischen dem Minimum und dem Maximum liegt. – pjs

+0

@pjs 100 ist der Durchschnitt (Mittelwert). Ich glaube, Sie haben einen Fehler bei der Berechnung des Mittelwerts gemacht. Ich habe es schon gegeben. – Zapata

+0

Kein Fehler, Sie sagten, Sie wollen ein Minimum von 40, maximal 330, und Durchschnitt (Mittelwert) von 100. [Der Mittelwert einer Dreiecksverteilung ** ist ** 'Mittelwert = (min + max + Modus)/3' ] (https://en.wikipedia.org/wiki/Triangular_distribution), damit wir berechnen können, was der Modus sein müsste. Ihre Nummern sind für eine Dreiecksverteilung undurchführbar. – pjs

Antwort

1

Korrigierte gemäß @Severin Pappadeux

Function trigDist(dMIn As Double, dMax As Double, dMean As Double) As Double 

    Dim dFR   As Double 
    Dim bProceed As Boolean 

    bProceed = True 

    '/ error checks    

    If dMIn >= dMax Then 
     MsgBox "max value less than min value." 
     bProceed = False 
    End If 

    If dMean < dMIn Then 
     MsgBox "Mean is less than min value." 
     bProceed = False 
    End If 

    If dMean > dMax Then 
     MsgBox "Mean is larger than max value." 
     bProceed = False 
    End If 


    If bProceed Then 

     dFR = Rnd() 

     If dFR < ((dMean - dMIn)/(dMax - dMIn)) Then 
      trigDist = Sqr(dFR * (dMean - dMIn) * (dMax - dMIn)) + dMIn 
     Else 
      trigDist = dMax - Sqr((1 - dFR) * (dMax - dMean) * (dMax - dMIn)) 
     End If 
    Else 

     trigDist = 0 
    End If 

End Function 
+0

Ich habe mich gefragt 1. Was ist das dFR? 2. Warum wurde sqr in der Formel verwendet? – Zapata

+1

https://en.wikipedia.org/wiki/Triangular_distribution – cyboashu

+0

Es gibt den Laufzeitfehler 5: Ungültiger Prozeduraufruf des Arguments, als ich die Zahlen von Min, Max und Durchschnitt änderte. – Zapata

1

Offensichtlich Antwort von @cyboashu ist falsch, weil Sie Min, Max und Mean haben.

So beginnen Sie mit der Wiederherstellung A, B, C von Eingang, mit der Tatsache von here, dass der Mittelwert gleich (A+B+C)/3 ist. Ich weiß nicht genug VBA, also ertragen Sie mit mir

A = Min 
B = Max 
C = 3.0*Mean - A - B 

If A >= B Then 
    print 'Error, Min is greater than Max' 
End If 

If C < A Then 
    print 'Error, Mean is too small' 
End If 

If C > B Then 
    print 'Error, Mean is too large' 
End If 

r = Rnd() 

If r < ((C - A)/(B - A)) Then 
    Res = A + Sqr(r * (B - A) * (C - A)) 
Else 
    Res = B - Sqr((1.0 - r) * (B - A) * (B - C)) 
End If 

return Res 
+1

vereinbart. Meine Antwort ist falsch. – cyboashu

+0

Ich habe meine Antwort gemäß Ihren Vorschlägen aktualisiert. – cyboashu

+0

@Severin Pappadeux es funktioniert nicht. Warum haben Sie das Mittel berechnet, während ich es bereits als durchschnittliche Zahl (100) angegeben habe? – Zapata