Abstract
Mit einer expliziten Form der inversen Verteilungsfunktion sollten Sie sbRandCDFInv verwenden. Aber wenn eine solche nicht vorliegt, können Sie mit einer linearen Approximation die Funktion sbRandPDF nutzen. Unglücklicherweise ist dieser Ansatz sehr rechenintensiv, selbst wenn Sie die Anzahl der Punkte bei identischen oder nahezu identischen Steigungen reduzieren können.
Ein Beispiel einer geschichteten Stichprobe:
Appendix – Programmcode sbRandPDF
Bitte beachten Sie dass diese Funktion die Funktion sbRandGeneral benötigt (aufruft).
Bitte den Haftungsausschluss im Impressum beachten.
Option Explicit
Function sbRandPDF(Optional dParam1, Optional dParam2, _
Optional dParam3, Optional dRandom = 1#) As Double
'Source (EN): http://www.sulprobil.com/sbrandpdf_en/
'Source (DE): http://www.bplumhoff.de/sbrandpdf_de/
'(C) (P) by Bernd Plumhoff 12-Sep-2014 PB V0.15
Dim dRand As Double
Dim i As Long
Static dPar1 As Double
Static dPar2 As Double
Static dPar3 As Double
Static vX(0 To 1000) As Variant
Static vY(0 To 1000) As Variant
If dRandom < 0# Or dRandom > 1# Then
sbRandPDF = CVErr(xlErrValue)
Exit Function
End If
If dRandom = 1# Then
dRand = Rnd()
Else
dRand = dRandom
End If
If dParam1 <> dPar1 Or dParam2 <> dPar2 Or dParam3 <> dPar3 Then
dPar1 = dParam1
dPar2 = dParam2
dPar3 = dParam3
'Initialize RandGeneral call parameters
For i = 0 To 1000
vX(i) = dPar1 + i * (dPar3 - dPar1) / 1000#
'Now we can insert an arbitrary PDF function
If vX(i) < dPar2 Then
vY(i) = (vX(i) - dPar1) / ((dPar3 - dPar1) * (dPar2 - dPar1))
If vY(i) < 0# Then vY(i) = 0#
Else
vY(i) = (dPar3 - vX(i)) / ((dPar3 - dPar1) * (dPar3 - dPar2))
If vY(i) < 0# Then vY(i) = 0#
End If
Next i
End If
'Depending on the PDF input range you need to feed start
'and end values to sbRandGeneral
sbRandPDF = sbRandGeneral(dPar1, dPar3, vX, vY, dRand)
End Function