View difference between Paste ID: cbJvrdpM and yk3XUK1M
SHOW: | | - or go back to the newest paste.
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
15+
        Tasks.Parallel.For(1, 100001, Sub(i As Integer)
16-
            ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf DoWork), i)
16+
                                          rBag.Add(NormalFunctions.StandardNormalInverse(0.00001 * (CInt(i) - 0.5)))
17-
        Next
17+
                                      End Sub)
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)
28+
29-
        rBag.Add(NormalFunctions.StandardNormalInverse(0.00001 * (CInt(i) - 0.5)))
29+
30
31
Public Class NormalFunctions
32
    Private Shared ReadOnly k As Double = 0.2316419
33
    Private Shared ReadOnly a() As Double = {0.31938153, -0.356563782, 1.781477937, -1.821255978, 1.330274429}
34
35
    Private Shared Function Density(x As Double) As Double
36
        Return Math.Pow(2 * Math.PI, -0.5) * Math.Exp(-0.5 * x * x)
37
    End Function
38
39
    Private Shared Function StandardNormal(x As Double) As Double
40
        Dim L As Double, q As Double, nx As Double, snd As Double, j As Integer, s As Double
41
42
        L = Math.Abs(x)
43
        q = 1 / (1 + k * L)
44
        nx = Density(L)
45
        'nx == f(abs(x))
46
47
        For j = 0 To 4
48
            s = s + a(j) * q ^ (j + 1)
49
        Next j
50
51
        snd = 1 - nx * s
52
        'SND = PHI(abs(x))
53
54
        If (x < 0) Then
55
            snd = 1 - snd
56
        End If
57
        'NOW SND = PHI(x)
58
59
        Return snd
60
    End Function
61
62
    Public Shared Function StandardNormalInverse(r As Double) As Double
63
        Dim Delta As Double, X As Double, Y As Double
64
65
        X = 0
66
        Delta = 1
67
        Do Until Delta <= 0.000000001
68
            Y = X - (StandardNormal(X) - r) / Density(X)
69
            Delta = Math.Abs(Y - X)
70
            X = Y
71
        Loop
72
73
        Return Y
74
    End Function
75
76
77
End Class