Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 24
  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
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    "Variare infinitivamente" ... a parte l'italiano, che vuoi dire?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    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'è

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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.

  7. #7
    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

  8. #8
    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.

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

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    96
    E con un loop? Così funziona ma ogni tanto il numero si ripete lo stesso
    codice:
    Do
                SoartedNum = Random.Next(1, DefinitivePlayer)
                PrecNum = SoartedNum
            Loop Until PrecNum = SoartedNum
    
    
            SoartedPlayer.Text = "Giocatore " & SoartedNum
    DefinitivePlayer è il numero di giocatori
    Ultima modifica di Gian01; 26-11-2013 a 16:52

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 © 2025 vBulletin Solutions, Inc. All rights reserved.