" La teoria della scimmia instancabile o delle scimmie infinite sostiene che se una scimmia preme su una tastiera tasti a caso per un tempo infinito, quasi certamente riuscirà a comporre un determinato testo. "
http://www.focus.it/scienza/scienze/che-cose-la-teoria-della-scimmia-instancabile
https://it.wikipedia.org/wiki/Teorema_della_scimmia_instancabile
http://www.ioprogrammo.it/index.php?topic=26511.msg96288;topicseen#msg96288
Ne ho fatto un semplice codice: ;D
Private Const LUNG As Integer = 4
Private Const PAROLA As String = "ciao"
Public Sub Main()
Dim fl As File
Dim i, random As Integer
Dim conteggio As Long
Dim t As New Byte[LUNG]
Dim ris As String
File.Save("/tmp/scimmia", Null)
fl = Open "/tmp/scimmia" For Write Append
Do
For i = 0 To LUNG - 1
random = Rand(97, 123)
If random = 123 Then random = 32
t[i] = CByte(random)
Next
ris = t.ToString(0, t.Count)
Print #fl, ris
Inc conteggio
Loop Until ris = PAROLA
Print "Digitata la parola '"; PAROLA; "' dopo "; conteggio; " tentativi."
End
Digitata la parola 'ciao' dopo 2760 tentativi.
con una piccola modifica per rendere piu' generico il test:
Public LUNG As Integer
Private Const PAROLA As String = "Perfezione"
Public Sub Main()
Dim fl As File
Dim i, random As Integer
Dim conteggio As Long
Dim t As New Byte[LUNG]
Dim ris As String
LUNG = Len(PAROLA)
File.Save("/tmp/scimmia", Null)
fl = Open "/tmp/scimmia" For Write Append
Do
For i = 0 To LUNG - 1
random = Rand(97, 123)
If random = 123 Then random = 32
t[i] = CByte(random)
Next
ris = t.ToString(0, t.Count)
Print #fl, ris
Inc conteggio
Loop Until ris = PAROLA
Print "Digitata la parola '"; PAROLA; "' dopo "; conteggio; " tentativi."
End
abbiamo un out of bound su t = CByte(random)
abbiamo un out of bound su t = CByte(random)
...perché quando crei la variabile vettoriale " t " in modo statico, le assegni una quantità di elementi pari a zero ! :-X
Infatti la variabile globale "LUNG" resta inizializzata di default a zero.
Il tuo codice va corretto dunque come segue:
Public LUNG As Integer
Private Const PAROLA As String = "perfez"
Public Sub Main()
Dim fl As File
Dim i, random As Integer
Dim conteggio As Long
Dim t As Byte[]
Dim ris As String
LUNG = Len(PAROLA)
t = New Byte[LUNG]
File.Save("/tmp/scimmia", Null)
fl = Open "/tmp/scimmia" For Write Append
Do
For i = 0 To LUNG - 1
random = Rand(97, 123)
If random = 123 Then random = 32
t[i] = CByte(random)
Next
ris = t.ToString(0, t.Count)
Print #fl, ris
Inc conteggio
Loop Until ris = PAROLA
Print "Digitata la parola '"; PAROLA; "' dopo "; conteggio; " tentativi."
End
Oltre a ciò v'è un altro problema: hai posto una parola da comporre avente un carattere con codice ASCII inferiore a 97 (carattere maiuscolo della "P"). Laddove invece il programma (ripreso da quello originario) prende in considerazione soltanto le lettere minuscole: codici ASCII da 97 a 123 - vedi la riga: Rand(97, 123). Quindi non sarà mai composta quella parola !
....e poi con una parola così lunga.... il programma morirà stanco ! ;D
Inserendo ad esempio la più breve parola "perfez", la scimmia ha impiegato 45957537 tentativi !!! :death: