+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 10 su 10

Discussione: Evitare estrazione 0 (zero) con Randomize

  1. #1
    tizike non è in linea Scolaretto
    Post
    403

    Evitare estrazione 0 (zero) con Randomize

    salve
    Il mio scopo era di generare tre numeri da 1-44 ed evitare che ci fosse tra le tre generate cifre
    un numero ripetuto contemporaneamente.
    Su questo ci sono , anzi mi pareva di esserci riuscita con

    codice:
    Private Sub Command1_Click()
    Dim cifre As String
        Dim cifra As Integer
        Randomize
        
        For i = 0 To 2
            cifra = Int(Rnd * 44) + 1
            While InStr(1, cifre, cifra) > 0
                cifra = Int(Rnd * 44) + 1
            Wend
            cifre = cifre & cifra
        Next i
    
        Text1.Text = Left(cifre, 1)
        Text2.Text = Mid(cifre, 2, 1)
        Text3.Text = Right(cifre, 1)
    End Sub
    Ho detto mi pareva in quanto mi é apparso un altro problema: ogni tanto viene generato anche uno '0' (zero)
    E non deve essere consentito.
    Pensavo di aver eliminato il pericolo in partenza con
    codice:
    While InStr(1, cifre, cifra) > 0
    eppure ogni tanto mi appare uno zero nei tre estratti.

    Dove é lo sbaglio? Si puo fare qualcosa in piu per evitarlo?
    grazie
    tizike
    Ultima modifica di tizike; 14-11-2018 16:27 

  2. #2
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    15,972
    Blogs
    5
    Scusa ma non si capisce molto.

    Tu devi generare numeri compresi tra 1 e 44 ? E che c'entra il codice che genera cifre? La linea

    numero = Int(Rnd * 44) + 1

    non genera "cifre" ma direttamente numeri compresi tra 1 e 44. Non può generare 0 e non ha bisogno d'altro
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  3. #3
    tizike non è in linea Scolaretto
    Post
    403
    Non mi sono spiegata bene, temo.
    lo so anch'io che con
    codice:
    text1.text = Int(Rnd * 44) + 1
    si generano numeri da 1-44
    Ma sopra ho detto che io voglio generatre tre numeri contemporaneamente
    quindi se io metto
    codice:
    text1.text = Int(Rnd * 44) + 1
    text2.text = Int(Rnd * 44) + 1
    text3.text = Int(Rnd * 44) + 1
    vengono ngenerati tre numeri ma puo succedere che tra i tre numeri generati esca un numero uguale (tra i tre)

    per evitare questo ho impostato la routine di sopra un po piu complessa.
    Con la quale routine non mi esce mai uno o due numeri uguali .
    Poi ho visto che mi genera anche uno zero. Cosa che non deve succedere.

  4. #4
    Sgrubak non è in linea Scolaretto
    Luogo
    Torrazza Piemonte
    Post
    191
    Ciao tizike,
    credo che l'errore di fondo, al di là della già citata confusione tra i termini numero e cifra, sia dovuta al salvataggio dei tre numeri (compresi tra 1 e 44) in una stringa. Penserei al cambio di [cifre] da String ad array di Integer. Poi ciclerei l'array, magari utilizzando una Function con risultato Boolean che scorra l'array e restituisca True nel caso in cui sia presente il numero specificato, ed inserendola come condizione per il ciclo While.
    Così eviteresti di capitare nella condizione in cui le prime due cifre generate siano 21 e 13: [cifre] corrisponderebbe a 2113. Se la terza [cifra] fosse 11, sarebbe consentito da quanto hai esposto come ragionamento (visto che è diversa da 21 e da 13), ma non dal tuo codice dato che [InStr(1, cifre, cifra)] sarebbe uguale a 2 e quindi maggiore di 0. Continuerebbe il ciclo cercando un altro numero.

    Ho un altro dubbio... Se la prima [cifra] generata è 30, con [Left(cifre, 1)] otterresti 3. Parimenti se l'ultima [cifra] generata fosse 10, con [Right(cifre,1)] otterresti 0 (cosa che non vuoi). Sicura che quel codice sia giusto? Non dovrebbe essere [Left(cifre, 2)] ?

  5. #5
    tizike non è in linea Scolaretto
    Post
    403
    Io ho messo (salvato temporaneamente) nella stringa per poter poi smembrare i risultati evitare la ripetizione dei numeri generati dal RND. Cosa che poi purtroppo si verifica ugualmente per i motivi che hai detto.

    Ho capito l'approccio che suggerisci ma che, a mio parere, sarebbe ancora piu complicato da impostare.
    Lo scopo di partenza é invece molto semplice: generare tre numeri di cui nessuno sia uguale agli altri due.
    Ma poiché stiamo parlando, guarda caso, di randomize é molto complesso.
    Vedo ancora come impostare. Nel frattempo spero in qualche altro lume.
    Grazie comunque SGrubak

  6. #6
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    15,972
    Blogs
    5
    Intanto cominciamo ad usare i termini corretti. Parla di 3 numeri (non parlare di cifre).

    In secondo luogo, devi usare un vettore di interi

    Dim num(1 To 3) As Integer

    e nel primo elemento generi il primo numero con

    numero(1) = Int(Rnd * 44) + 1

    Fatto questo, il seguito può essere semplicissimo o un po' più complicato ma scritto meglio. Per un codice semplicissimo ti basta

    codice:
        Randomize Timer
        Dim num(1 To 3) As Integer
        
        num(1) = Int(Rnd * 44) + 1
        Do
            num(2) = Int(Rnd * 44) + 1
        Loop While num(2) = num(1)
        Do
            num(3) = Int(Rnd * 44) + 1
        Loop While num(3) = num(2) Or num(3) = num(1)

    P.S. Ma possibile che dopo tanti anni hai ancora queste difficoltà con la programmazione elementare con il vb6 ... ? Scusa, non riesco a crederci ...
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  7. #7
    tizike non è in linea Scolaretto
    Post
    403
    Mi pare comunque che non fosse proprio tanto elementare.
    Ho comunque adattato cosi il tuo tip
    Sembra che tutte le condizioni siano soddisfatte:
    nessun numero uguale e poi nessun zero.
    codice:
    Private Sub Command1_Click()
    Randomize Timer
        Dim numero(1 To 3) As Integer
        
        numero1 = Int(Rnd * 44) + 1
        Do
            numero2 = Int(Rnd * 44) + 1
        Loop While numero2 = numero1
        Do
            numero3 = Int(Rnd * 44) + 1
        Loop While numero3 = numero2 Or numero2 = numero1
    
    End Sub
    Risolto
    Grazie

  8. #8
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    15,972
    Blogs
    5
    No, non va bene ... numero() è un vettore mentre numero1 è una variabile semplice, diversa dal vettore.

    Quindi il codice che hai modificato NON va bene

    Deve essere

    codice:
    Randomize Timer
        Dim numero(1 To 3) As Integer
        
        numero(1) = Int(Rnd * 44) + 1
        Do
            numero(2) = Int(Rnd * 44) + 1
        Loop While numero(2) = numero(1)
        Do
            numero(3) = Int(Rnd * 44) + 1
        Loop While numero(3) = numero(2) Or numero(2) = numero(1)
    OPPURE, se usi variabili semplici

    codice:
    Randomize Timer
        Dim numero1 As Interger
        Dim numero2 As Interger
        Dim numero3 As Interger
        
        numero1 = Int(Rnd * 44) + 1
        Do
            numero2 = Int(Rnd * 44) + 1
        Loop While numero2 = numero1
        Do
            numero3 = Int(Rnd * 44) + 1
        Loop While numero3 = numero2 Or numero2 = numero1
    e mi dispiace confermartelo, dopo 8 anni di programmazione con VB6, questo è codice elementare.
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  9. #9
    Dev-01 non è in linea Scolaretto
    Post
    404
    Tra l'altro il codice contiene un altro errore, dovendo generare cifre comprese fra 1 e 44 non:

    codice:
    Int(Rnd * 44) + 1
    ma

    codice:
    Int(Rnd * 43) + 1

  10. #10
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    15,972
    Blogs
    5
    Sei sicuro ?
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

+ Rispondi al Thread

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi