Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 24

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    96

    [VB.net]Evitare ripetizione numero con random

    E' da un po' che non scrivo sul forum ma sono tornato con un problema che non riesco a risolvere più che latro perchè non lo capisco.
    Sto sviluppando un programma per giocare ad obbligo o verità. Grazie a una random si seleziona il giocatore a cui tocca ma mi è capito spesso che lo stesso numero venisse ripetuto 4 o 5 volte di seguito cosa che voglio evitare.
    Uso questo codice:
    codice:
    Dim Random As New Random
    Dim SoartedNum As Integer
     Dim PrecNum As Integer = 0
    
     Private Sub Sorter_Click(sender As Object, e As EventArgs) Handles Sorter.Click 'Pulsante per il sorteggio
    
    
            SoartedNum = Random.Next(1, 5)
    
    
            If PrecNum = 0 Then
                PrecNum = SoartedNum
    
    
                SoartedPlayer.Text = "Giocatore " & SoartedNum
                SelObbligo.Enabled = True
                SelVerita.Enabled = True
            Else
                SoartedNumIsntSoartedNum()
            End If
        End Sub
    
    
        Public Function SoartedNumIsntSoartedNum()
            If PrecNum = SoartedNum Then
                SoartNum()
            Else
                SoartedPlayer.Text = "Giocatore " & SoartedNum
                SelObbligo.Enabled = True
                SelVerita.Enabled = True
            End If
        End Function
    
    
        Public Function SoartNum()
            SoartedNum = Random.Next(1, 5)
            PrecNum = SoartedNum
    
    
            SoartedNumIsntSoartedNum()
        End Function
    Quando eseguo il debug non rileva errori nel codice, ma quando schiaccio sorteggia i numeri si ripetono lo stesso come se il codice nn ci fosse.
    Qualcuno riesce ad aiutarmi? Grazie

  2. #2
    Mi sembra che tu ti stia complicando la vita inutilmente... se vuoi semplicemente che il nuovo numero estratto sia diverso dall'ultimo ti basta fare:
    codice:
    Dim Random As New Random
    Dim PrecNum As Integer = 0
    
    Private Sub Sorter_Click(sender As Object, e As EventArgs) Handles Sorter.Click
        Dim soartedNum As Integer
        If PrecNum=0 Then
            soartedNum = Random.Next(1, 5)
        Else
            soartedNum = Random.Next(1, 4)
            If soartedNum >= PrecNum Then
                soartedNum+=1
            End If
        End If
        SoartedPlayer.Text = "Giocatore " & soartedNum
        SelObbligo.Enabled = True
        SelVerita.Enabled = True
    End If
    L'idea è che se non è ancora stato sorteggiato nessuno allora scegliamo da tutto il range (ovvero, da 1 a 5), mentre se è già stato sorteggiato qualcuno e non vogliamo ri-estrarlo, la scelta si riduce a 4 persone, per cui estraiamo dal range da 1 a 4, aggiungendo 1 se il numero estratto è superiore o uguale al numero appena uscito (così facendo rimappiamo il range [1, 4] sull'insieme di persone che è "papabile" di essere estratto).
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    96
    Si ripete comunque
    P.S. Il mio range non è di 5 può variare infinitivamente.... Io ho messo 5 per non dover postare anche il codice che determina il range
    Ho fatto in modo però che dove tu hai messo 4 fosse uno in meno rispetto a quello iniziale
    Ultima modifica di Gian01; 25-11-2013 a 19:35

  4. #4
    Quote Originariamente inviata da Gian01 Visualizza il messaggio
    Si ripete comunque
    Non può ripetersi l'ultimo uscito (che è quello che volevi fare nel tuo codice), se quello che invece vuoi è che chi è uscito non ri-esca fino al giro successivo devi fare come ha detto oregon (anche se si può anche ottimizzare un po', non c'è necessariamente bisogno di togliere gli elementi).
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,539
    Quote Originariamente inviata da MItaly Visualizza il messaggio
    Non può ripetersi l'ultimo uscito (che è quello che volevi fare nel tuo codice), se quello che invece vuoi è che chi è uscito non ri-esca fino al giro successivo devi fare come ha detto oregon (anche se si può anche ottimizzare un po', non c'è necessariamente bisogno di togliere gli elementi).
    Ciao MItaly,
    questo interessa anche a me come fai senza rimuovere gli elementi?
    io ad esempio avrei fatto così : (lo scrivo in c# per non dare la pappa pronta a Gian01, anche se basta un traduttore...)

    codice:
            List<int> nGiocatori;
            int nTotGiocatori = 5;
            public void button_Click(object sender, EventArgs e)
            {
                if (nGiocatori == null || nGiocatori.Count() < 1)
                {
                    Random r = new Random();
                    nGiocatori = Enumerable.Range(1, nTotGiocatori).OrderBy(o => r.Next(nTotGiocatori)).ToList();
                }
                int nSorteggiato = nGiocatori.First();
                nGiocatori.Remove(nSorteggiato);
            }

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    "Variare infinitivamente" ... a parte l'italiano, che vuoi dire?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    96
    Vuol dire che il numero di giocatori non è definito, c'è solo un minimo che è 2 ma un massimo non c'è

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Allora riempi un oggetto List con i giocatori ed estrai un valore compreso nel numero di elementi nella List.
    Elimina dalla List il giocatore appena estratto e ripeti.

    P.S. Infinitamente ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    96
    Quando provo ti faccio sapere
    Ultima modifica di Gian01; 25-11-2013 a 20:52

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    anche se
    Lasciamo qualcosa da fare anche a lui ... :-)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.