2015-08-26 42 views
3

我在VBA是完美的作品如下:從VBA翻譯ErlangB公式PHP

Private Function MinMax(Val As Single, Min As Single, Max As Single) As Single 
'Apply minimum and maximum bounds to a value 
    MinMax = Val 
    If Val < Min Then MinMax = Min 
    If Val > Max Then MinMax = Max 
End Function 

'----------------------------------------------------------------------- 
Public Function ErlangB(Servers As Single, Intensity As Single) As Single 
'The Erlang B formula calculates the percentage likelyhood of the call 
' being blocked, that is that all the trunks are in use and the caller 
' will receive a busy signal. 
' Servers = Number of telephone lines 
' Intensity = Arrival rate of calls/Completion rate of calls 
' Arrival rate = the number of calls arriving per hour 
' Completion rate = the number of calls completed per hour 
Dim Val As Single, Last As Single, B As Single 
Dim Count As Long, MaxIterate As Long 
On Error GoTo ErlangBError 
    If (Servers < 0) Or (Intensity < 0) Then 
      ErlangB = 0 
      Exit Function 
    End If 
    MaxIterate = Fix(Servers) 
    Val = Intensity 
    Last = 1 ' for server = 0 
    For Count = 1 To MaxIterate 
      B = (Val * Last)/(Count + (Val * Last)) 
      Last = B 
    Next Count 
ErlangBExit: 
    ErlangB = MinMax(B, 0, 1) 
    Exit Function 

ErlangBError: 
    B = 0 
    Resume ErlangBExit 
End Function 

我試圖用下面的代碼來創建它在PHP:

function minmax($val, $min, $max) 
{ 
    //Apply minimum and maximum bounds to a value 
    $minmax = $val; 
    if($val < $min){ $minmax = $min;} 
    if($val > $max) { $minmax = $max;} 

    Return $minmax; 
} 

function erlangb($servers, $intensity) 
{ 
    //'The Erlang B formula calculates the percentage likelyhood of the call 
    //' being blocked, that is that all the trunks are in use and the caller 
    //' will receive a busy signal. 
    //' Servers = Number of telephone lines 
    //' Intensity = Arrival rate of calls/Completion rate of calls 
    //' Arrival rate = the number of calls arriving per hour 
    //' Completion rate = the number of calls completed per hour 
    if($servers < 0 || $intensity < 0) { 
     $erlangb = 0; 
     } 
    Else{ 
     $maxiterate = floor($servers); 
     $val = $intensity; 
     $last = 1; 
     $count = 1; 
     while($count < $maxiterate){ 
      $b = ($val * $last)/($count + ($val * $last)); 
      $last = $b; 
      $count ++; 
     } 
    } 
    return minmax($b, 0, 1); 
} 

不過我並不總是得到相同的結果。例如像這樣的請求:

erlangb(10,5)

可生產的VBA 0.01838457結果,但是在PHP的0.037457785974194的值。

我在轉換過程中錯過了什麼導致了巨大差異的值?

回答

1

更改此

while($count < $maxiterate){

while($count <= $maxiterate){

+0

謝謝!這正是問題所在。 –