Percolation/Site percolation: Difference between revisions

Content added Content deleted
 
Line 850: Line 850:
#define WET "v"
#define WET "v"


Dim Shared As String grid()
Dim Shared As String grid
Dim Shared As Integer last, lastrow, m, n
Dim Shared As Integer last, lastrow, m, n


Sub make_grid(x As Integer, y As Integer, p As Double)
Sub makeGrid(x As Integer, y As Integer, p As Double)
Dim As Integer i, j
m = x
m = x
n = y
n = y
Redim Preserve grid(x*(y+1)+1)
grid = String(x*(y+1)+1, Chr(10))
last = Len(grid)
last = Len(grid)
Dim As Integer lastrow = last-n
lastrow = last - n
Dim As Integer i, j
For i = 0 To x-1
For i = 0 To x-1
For j = 1 To y
For j = 1 To y
grid(1+i*(y+1)+j) = Iif(Rnd < p, EMPTY, SOLID)
Mid(grid, 1+i*(y+1)+j, 1) = Iif(Rnd < p, EMPTY, SOLID)
Next j
Next j
Next i
Next i
End Sub
End Sub


Function ff(i As Integer) As Boolean
Function ff(i As Integer) As Integer
If i <= 0 Or i >= last Or grid(i) <> EMPTY Then Return 0
If i <= 0 Or i >= last Or Mid(grid, i, 1) <> EMPTY Then Return 0
grid(i) = WET
Mid(grid, i, 1) = WET
Return i >= lastrow Or (ff(i+m+1) Or ff(i+1) Or ff(i-1) Or ff(i-m-1))
Return (i >= lastrow) Or ff(i+m+1) Or ff(i+1) Or ff(i-1) Or ff(i-m-1)
End Function
End Function


Line 881: Line 881:
End Function
End Function


Randomize Timer
Dim As Double p
makeGrid(15, 15, 0.55)
Dim As Integer ip, i, cont
percolate()
Print "15x15 grid:";
Print grid


Print "running 10,000 tests for each case:"
make_grid(15, 15, 0.55)
Dim As Double p
Print "15x15 grid:"
Dim As Integer ip, i, cnt
For i = 1 To Ubound(grid)
For ip = 0 To 10
Print grid(i);
If i Mod 15 = 0 Then Print
Next i

Print !"\nrunning 10,000 tests for each case:"
For ip As Ubyte = 0 To 10
p = ip / 10
p = ip / 10
cont = 0
cnt = 0
For i = 1 To 10000
For i = 1 To 10000
make_grid(15, 15, p)
makeGrid(15, 15, p)
cont += percolate()
cnt += (percolate() = 1)
Next i
Next i
Print Using "p=#.#: #.####"; p; cont/10000
Print Using "p=#.#: #.####"; p; Abs(cnt / 10000)
Next ip
Next ip

Sleep</syntaxhighlight>
Sleep</syntaxhighlight>