Advertisement
Guest User

Untitled

a guest
Sep 14th, 2014
299
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VB.NET 2.11 KB | None | 0 0
  1. Imports System.Collections.Concurrent
  2. Imports System.Threading
  3.  
  4. Public Class Form1
  5.     Const TCOUNT As Integer = 100000
  6.  
  7.     Dim rBag As ConcurrentBag(Of Double)
  8.  
  9.  
  10.     Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
  11.         rBag = New ConcurrentBag(Of Double)
  12.  
  13.         Dim swTimer As Stopwatch = Stopwatch.StartNew()
  14.  
  15.         For i = 1 To TCOUNT
  16.             ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf DoWork), i)
  17.         Next
  18.  
  19.         Do Until rBag.Count = TCOUNT
  20.             Thread.Sleep(0)
  21.         Loop
  22.  
  23.         swTimer.Stop()
  24.  
  25.         MessageBox.Show("Run time = " & swTimer.ElapsedMilliseconds.ToString & " miliseconds.")
  26.     End Sub
  27.  
  28.     Private Sub DoWork(ByVal i As Integer)
  29.         rBag.Add(NormalFunctions.StandardNormalInverse(0.00001 * (CInt(i) - 0.5)))
  30.     End Sub
  31.  
  32. End Class
  33.  
  34.  
  35. Public Class NormalFunctions
  36.     Private Shared ReadOnly k As Double = 0.2316419
  37.     Private Shared ReadOnly a() As Double = {0.31938153, -0.356563782, 1.781477937, -1.821255978, 1.330274429}
  38.  
  39.     Private Shared Function Density(x As Double) As Double
  40.         Return Math.Pow(2 * Math.PI, -0.5) * Math.Exp(-0.5 * x * x)
  41.     End Function
  42.  
  43.     Private Shared Function StandardNormal(x As Double) As Double
  44.         Dim L As Double, q As Double, nx As Double, snd As Double, j As Integer, s As Double
  45.  
  46.         L = Math.Abs(x)
  47.         q = 1 / (1 + k * L)
  48.         nx = Density(L)
  49.         'nx == f(abs(x))
  50.  
  51.         For j = 0 To 4
  52.             s = s + a(j) * q ^ (j + 1)
  53.         Next j
  54.  
  55.         snd = 1 - nx * s
  56.         'SND = PHI(abs(x))
  57.  
  58.         If (x < 0) Then
  59.             snd = 1 - snd
  60.         End If
  61.         'NOW SND = PHI(x)
  62.  
  63.         Return snd
  64.     End Function
  65.  
  66.     Public Shared Function StandardNormalInverse(r As Double) As Double
  67.         Dim Delta As Double, X As Double, Y As Double
  68.  
  69.         X = 0
  70.         Delta = 1
  71.         Do Until Delta <= 0.000000001
  72.             Y = X - (StandardNormal(X) - r) / Density(X)
  73.             Delta = Math.Abs(Y - X)
  74.             X = Y
  75.         Loop
  76.  
  77.         Return Y
  78.     End Function
  79.  
  80.  
  81. End Class
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement