LottoGAM Forum

Info su quale linguaggio utilizzare

« Older   Newer »
  Share  
view post Posted on 27/8/2021, 09:40
Avatar

Top Member

Group:
Member
Posts:
786
Location:
Sardegna

Status:


Buongiorno posso chiedere un consiglio su che tipo di codice o linguaggio di programmazione utilizzare per fare le ricerche veloci su tutto l’archivio lotto
per trovare, esempio su tutti gli Ambi, la Frequenza, Ritardo Attale e storico.
Uilizzando i classici cicli for next i tempi sono lunghissimi.
Se avete qualche consiglio da darmi o qualche variante di ciclo per velocizzare la ricerca ve ne sono grato.

Francesco
 
Web  Top
view post Posted on 27/8/2021, 22:47
Avatar

Top Member

Group:
Administrator
Posts:
1,718

Status:


Ciao, nel mio piccolo credo che per analisi di dati il Perl sia un linguaggio adeguato. Forse più del Vb o del v net. Vediamo se commenti più autorevoli possano aggiungere qualcosa.
Saluti
 
Web  Top
view post Posted on 28/8/2021, 08:47
Avatar

Junior

Group:
Member
Posts:
69

Status:


Con Visual Studio i tempi sono molto brevi, almeno se le routine sono ottimizzate...
 
Top
view post Posted on 28/8/2021, 09:44
Avatar

Top Member

Group:
Member
Posts:
786
Location:
Sardegna

Status:


Ringrazio per gli interventi, io conosco un poco visual studio 2019, ma non riesco ad andare più avanti dei cicli for next.
Per Lorenzo hai delle indicazioni su come operare per la velocizzazione delle ricerche in quanto se cerco solo il Rit.Att.
è veloce, il problema nasce quando deve scansionare l'intero archivio per gli altri ritardi.
Pensavo di appoggiarmi ad un file do testo, ma non sò se è la via migliore.
Francesco
 
Web  Top
view post Posted on 28/8/2021, 11:10
Avatar

Junior

Group:
Member
Posts:
69

Status:


Ciao, bene il file di testo, ma è meglio caricare tutto in vettori in memoria (dim matrice(), magari multidimensionale, se scarichi Lotto Ritardi per Windows ci sono anche i source per Visual Studio 2019, puoi usarlo come base di partenza) che è più veloce, per il calcolo dei ritardi bisogna interrompere la ricerca una volta trovato il ritardo cercato, in genere io controllo tutti gli ambi (4004) prima di attaccare le combinazioni superiori (terzine, quartine, cinquine, ...). Comunque presto, ho appena terminato le formazioni omogenee, attaccherò il menù Ritardi per completare le funzioni principali di Lotto Ritardi per Windows, quindi per non fare lavoro doppio potresti aspettare un paio di settimane intanto ti puoi studiare il programma per poi implementare le tue funzioni personalizzate che sarei lieto di includere.

Per altre dritte, chiedi pure !

Lorenzo C.
 
Top
view post Posted on 28/8/2021, 11:33
Avatar

Top Member

Group:
Member
Posts:
786
Location:
Sardegna

Status:


Grazie Lorenzo darò uno sguardo e ti farò sapere.
Francesco
 
Web  Top
view post Posted on 31/8/2021, 09:33
Avatar

Top Member

Group:
Member
Posts:
786
Location:
Sardegna

Status:


Buongiorno Lorenzo, ti ringrazio per la tua disponibilità e per le indicazioni date.
Ho guardato il tuo codice, ma sinceramente la scarsa conoscenza che ho del vb non mi ha consentito di capire molto dei passaggi,
io utilizzo più un vba adattato e quindi parte del tuo codice non riesco ad interpretarli.
Ti inserisco il codice che utilizzo per la ricerca di Freq-Rit.Att-Rit.Sto degli ambi, nel mio pc impiega ben 25 sec per visualizzarmi i dati.
Utilizzo un file di testo per l'intero archivio e poi svolgo una ricerca tramite cicli for next, ho visto che più o meno anche tu utilizzi la stessa procedura,
solo che a me impiega tanto tempo senza andare a parlare se si passa a ricerche superiori.

HTML
Private Sub AmbiTutti_Load(sender As Object, e As EventArgs) Handles MyBase.Load
CreaMatrice() 'Matrice archivio
conta = 0
For A1 = 1 To 89
For A2 = A1 + 1 To 90
conta = conta + 1
Ambi(conta, 0) = conta 'Progressivo
Ambi(conta, 1) = A1 '1° numero
Ambi(conta, 2) = A2 '2° numero
Ambi(conta, 3) = 0 'Frequenza
Ambi(conta, 4) = 0 'Rit.Attuale
Ambi(conta, 5) = 0 'Rit.Storico
Ambi(conta, 6) = 0 'Memorizza riga Uscita
Next A2
Next A1
End Sub
Sub CercaAmbi()
Dim I As Long : Dim rusc As Long : Dim rig As Long
Dim ini As Long : Dim fin As Long
Dim caso As Long : Dim nambi As Long
caso = 0 : MaxFre = 0 : MaxRit = 0
ini = 0
fin = NEMax
For nambi = 1 To NrAmbi
For rig = ini To fin
conta = 0
For I = 0 To 4
If dati(rig)(colr + I) = Ambi(nambi, 1) Then
conta = conta + 1
ElseIf dati(rig)(colr + I) = Ambi(nambi, 2) Then
conta = conta + 1
End If
If conta = NumEstr Then Exit For
Next I
'--------------------------------------
If conta = 2 Then
Ambi(nambi, 3) = Ambi(nambi, 3) + 1 'Frequenza
If MaxFre < Ambi(nambi, 3) Then MaxFre = Ambi(nambi, 3)
rusc = rig - Ambi(nambi, 6) 'riga uscita ambo
Ambi(nambi, 6) = rig 'memorizza riga
If rusc > Ambi(nambi, 5) And rig < fin Then Ambi(nambi, 5) = rusc 'Rit.Sto.
Ambi(nambi, 4) = fin - rig 'Ritardo Attuale
If MaxRit < Ambi(nambi, 4) Then MaxRit = Ambi(nambi, 4)
End If
Next rig
Next nambi
End Sub


Se vuoi fare un commento al codice per capire dove sbaglio, ti sono grato.
Francesco
 
Web  Top
view post Posted on 31/8/2021, 10:09
Avatar

Junior

Group:
Member
Posts:
69

Status:


Sinceramente non ho capito bene come possa funzionare la tua routine (chi battezza NEAmbi ? e altre variabili), però
tieni conto del fatto che operare direttamente sulle celle di un foglio elettronico è un processo molto lento:
conviene trasferire inizialmente tutte le celle in vettori in memoria e poi far girare la routine sempre sui valori in memoria,
questo perchè chiedere al computer di reperire ogni volta la cella sul foglio elettronico appesantisce oltremodo l'elaborazione.

Saluti

Lorenzo C.

Come si chiama il file di testo ? Come viene caricato in memoria?
Chi battezza queste variabili: NEMax, NrAmbi ....
Chi richiama le routines e come ?
 
Top
view post Posted on 31/8/2021, 10:27
Avatar

Top Member

Group:
Member
Posts:
786
Location:
Sardegna

Status:


hai ragione avevo saltato la parte iniziale pensando che fosse importante solo il ciclo di ricerca.
Questo è il codice poi la matrice la visualizzo in un DataGridView.

CODICE
Imports System.IO
Public Class AmbiTutti
   Public Shared dati As Dictionary(Of Integer, String()) = New Dictionary(Of Integer, String())
   Public Shared lR() As String
   Public Shared NEMax As Integer
   '---------------------------------------------------------------------------------------------
   Public NrAmbi As Integer = 4005
   Public Ambi(NrAmbi, 7) As String
   Public NumEstr As Byte = 2 'Quantità Estratti su 2 numeri
   Public MaxRit As Integer  'Max.Rit.Att
   Public MaxFre As Integer  'Max.Frequenza
   Dim Sc As String : Dim colr As Byte : Dim A1 As Long : Dim A2 As Long : Dim conta As Long
   Public Shared Sub CreaMatrice()
       dati.Clear()
       Dim percorso As String = Directory.GetCurrentDirectory()
       Dim nomeFile As String = "\ArchivioLotto.txt"
       Using mydati As IO.StreamReader = New IO.StreamReader(percorso & nomeFile)
           Dim p As String = mydati.ReadToEnd
           Dim n As Integer
           lR = p.Split(vbCrLf)
           For n = 0 To lR.Length - 1
               dati.Add(n, lR(n).Split(";"))
           Next n
           NEMax = lR.Length - 2
       End Using
   End Sub
   Private Sub AmbiTutti_Load(sender As Object, e As EventArgs) Handles MyBase.Load
       CreaMatrice() 'Matrice archivio
       conta = 0
       For A1 = 1 To 89
           For A2 = A1 + 1 To 90
               conta = conta + 1
               Ambi(conta, 0) = conta 'Progressivo
               Ambi(conta, 1) = A1   '1° numero
               Ambi(conta, 2) = A2   '2° numero
               Ambi(conta, 3) = 0    'Frequenza
               Ambi(conta, 4) = 0    'Rit.Attuale
               Ambi(conta, 5) = 0    'Rit.Storico
               Ambi(conta, 6) = 0    'Memorizza riga Uscita
           Next A2
       Next A1
   End Sub
   Sub CercaAmbi()
       Dim I As Long : Dim rusc As Long : Dim rig As Long
       Dim ini As Long : Dim fin As Long
       Dim caso As Long : Dim nambi As Long
       caso = 0 : MaxFre = 0 : MaxRit = 0
       ini = 0
       fin = NEMax
       For nambi = 1 To NrAmbi
           For rig = ini To fin
               conta = 0
               For I = 0 To 4
                   If dati(rig)(colr + I) = Ambi(nambi, 1) Then
                       conta = conta + 1
                   ElseIf dati(rig)(colr + I) = Ambi(nambi, 2) Then
                       conta = conta + 1
                   End If
                   If conta = NumEstr Then Exit For
               Next I
               '--------------------------------------
               If conta = NumEstr Then
                   Ambi(nambi, 3) = Ambi(nambi, 3) + 1   'Frequenza
                   If MaxFre < Ambi(nambi, 3) Then MaxFre = Ambi(nambi, 3)
                   rusc = rig - Ambi(nambi, 6)   'riga uscita ambo
                   Ambi(nambi, 6) = rig  'memorizza riga
                   If rusc > Ambi(nambi, 5) And rig < fin Then Ambi(nambi, 5) = rusc 'Rit.Sto.
                   Ambi(nambi, 4) = fin - rig   'Ritardo Attuale
                   If MaxRit < Ambi(nambi, 4) Then MaxRit = Ambi(nambi, 4)
               End If
           Next rig
       Next nambi
       '=== Visualizzo i dati in una DataGridView ==================================
   End Sub
 
Web  Top
view post Posted on 31/8/2021, 11:53
Avatar

Junior

Group:
Member
Posts:
69

Status:


Resta sempre il problema dell'accesso continuo e ripetuto ad una matrice datagrid invece che a una matrice in memoria.
Proprio stamattina ho completato le routine di calcolo del ritardo degli ambi e degli ambi su tutte nel mio programma
Lotto Ritardi per Windows rel. 0.59 , ho caricato sul sito sourceforge i source e l'eseguibile, magari puoi provare a darci un'occhiata
per paragonare i risultati dati e, perchè no, anche ai source.

Link https://sourceforge.net/projects/lotto-rit...59.zip/download

Lorenzo C.
 
Top
view post Posted on 31/8/2021, 12:14
Avatar

Junior

Group:
Member
Posts:
69

Status:


Inoltre vba non è un linguaggio compilato ma deve essere interpretato di volta in volta durante l'esecuzione, ciò rallenta il tutto
 
Top
view post Posted on 31/8/2021, 13:21
Avatar

Top Member

Group:
Member
Posts:
786
Location:
Sardegna

Status:


Ciao Lorenzo, prima di tutto un grazie per le tue risposte, ma probabilmente non mi sono spiegato bene.
L'accesso continuo è sulla matrice dati()() e non sul DataGridView.
Il Datagridview lo uso solo per visualizzare la matrice Ambi() e impiega solo pochi secondi.
Per quanto concerne il linguaggio vba è solo riferito alla mia conoscenza maggiore, ma il programmino è realizzato in visual studio 2019.

Francesco
 
Web  Top
view post Posted on 31/8/2021, 19:54
Avatar

Junior

Group:
Member
Posts:
69

Status:


Ho capito, il problema è che tu analizzi 4005 volte (il numero totale degli ambi) l'intero archivio
che, se dal 1939, comprende più di 5000 estrazioni. Ciò è lento...

Io utilizzo un approccio completamente diverso : elenco tutti gli ambi usciti dalla ultima estrazione alla prima (ciclo For ... Step -1),
10 ambi per ruota, 10 ruote, e memorizzo in un vettore di 4005 elementi i ritardi trovati (solo se ancora pari a 0),
vettore ambi(1 to 90)(1 to 90), al quale, volendo è possibile aggiungere anche la frequenza di uscita (1 to 2) se interessa.

Così analizzo l'archivio estrazioni una sola volta con enorme minore dispendio di cicli di elaborazione.
Più tardi è possibile analizzare una sola volta il vettore ambi per estrarre solo gli ambi con il ritardo o la frequenza maggiore.

ATTENZIONE: quando inserisci dati nel vettore ambi ricordati di mettere sempre prima il numero minore dei due che compongono l'ambo
facendo opportuno swap dei due numeri, in modo da utilizzare solo 4005 valori dei 90*90=8100 che compongono il vettore.

E' tutto anche in Lotto Ritardi per Windows, che è praticamente ... una scheggia!

Saluti.

Lorenzo C.
 
Top
view post Posted on 31/8/2021, 20:05
Avatar

Top Member

Group:
Member
Posts:
786
Location:
Sardegna

Status:


Grazie Lorenzo, sempre gentile, cercherò di mettere a frutto i tuoi consigli.
Francesco
 
Web  Top
13 replies since 27/8/2021, 09:40   158 views
  Share