100 prisoners: Difference between revisions

no edit summary
No edit summary
Line 5,335:
<pre>Random method resulted in a success rate of 0%.
Optimal method resulted in a success rate of 31.129%.</pre>
 
=={{header|QB64}}==
<lang QB64>
Const Found = -1, Searching = 0, Status = 1, Tries = 2
Const Attempt = 1, Victories = 2, RandomW = 1, ChainW = 2
Randomize Timer
 
Dim Shared Prisoners(1 To 100, Status To Tries) As Integer, Drawers(1 To 100) As Integer, Results(1 To 2, 1 To 2) As Integer
Print "100 prisoners"
Print "Random way to search..."
For a = 1 To 2000
Init
Results(RandomW, Attempt) = Results(RandomW, Attempt) + 1
RandomWay
If verify% Then Results(RandomW, Victories) = Results(RandomW, Victories) + 1
Next
 
Print: Print "Chain way to search..."
For a = 1 To 2000
Init
Results(ChainW, Attempt) = Results(ChainW, Attempt) + 1
ChainWay
If verify% Then Results(ChainW, Victories) = Results(ChainW, Victories) + 1
Next
Print: Print "Results: "
Print " Attempts "; Results(RandomW, Attempt); " "; "Victories "; Results(RandomW, Victories); " Ratio:"; Results(RandomW, Victories); "/"; Results(RandomW, Attempt)
Print
Print " Attempts "; Results(ChainW, Attempt); " "; "Victories "; Results(ChainW, Victories); " Ratio:"; Results(ChainW, Victories); "/"; Results(ChainW, Attempt)
End
 
Function verify%
Dim In As Integer
Print "veryfing "
verify = 0
For In = 1 To 100
If Prisoners(In, Status) = Searching Then Exit For
Next
If In = 101 Then verify% = Found
End Function
 
Sub ChainWay
Dim In As Integer, ChainChoice As Integer
Print "Chain search"
For In = 1 To 100
ChainChoice = In
Do
Prisoners(In, Tries) = Prisoners(In, Tries) + 1
If Drawers(ChainChoice) = In Then Prisoners(In, Status) = Found: Exit Do
ChainChoice = Drawers(ChainChoice)
Loop Until Prisoners(In, Tries) = 50
Next In
End Sub
 
Sub RandomWay
Dim In As Integer, RndChoice As Integer
Print "Random search"
For In = 1 To 100
Do
Prisoners(In, Tries) = Prisoners(In, Tries) + 1
If Drawers(Int(Rnd * 100) + 1) = In Then Prisoners(In, Status) = Found: Exit Do
Loop Until Prisoners(In, Tries) = 50
Next
Print "Executed "
End Sub
 
 
Sub Init
Dim I As Integer, I2 As Integer
Print "initialization"
For I = 1 To 100
Prisoners(I, Status) = Searching
Prisoners(I, Tries) = Searching
Do
Drawers(I) = Int(Rnd * 100) + 1
For I2 = 1 To I
If Drawers(I2) = Drawers(I) Then Exit For
Next
If I2 = I Then Exit Do
Loop
Next I
Print "Done "
End Sub
 
</lang>
 
=={{header|Quackery}}==