Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    252

    vb2010 numeri random non ripetuti

    Come faccio a non far ripetere i stessi numeri?
    vorrei che estraesse in random i numeri da 1 a 112 senza lo 0 ovviamente ma solo una volta senza ripetizioni.

    codice:
      Module Module1
    
        Public Mazzo(0 To 112) As Integer
    
        Public Sub CreaMazzo()
            Randomize()
            Dim i As Integer
            For i = 0 To UBound(Mazzo)
                Mazzo(i) = Int(Rnd() * 112)
                Form1.Label1.Text = Form1.Label1.Text & (Mazzo(i) & " ")
    
            Next
    
    
    
    
        End Sub
    
    End Module
    grazie

  2. #2
    Potresti usare un array di Boolean, della stessa dimensione del mazzo (cioè 112 elementi). Ogni volta che estrai un numero metti il valore True nel rispettivo elemento, in modo da escludere quella carta nell'estrazione seguente.

    L'algoritmo da te proposto ad ogni estrazione di una carta diventa via via sempre più lento, in quanto sarà sempre più difficile estrarre carte "nuove".

    Se io fossi in te opterei per un algoritmo un po' più "furbo": carico le carte in una collection (per esempio una List) e creo un'altra collection vuota, dove metterò le carte prese a caso dal primo mazzo. Con un ciclo for rimuovo un elemento a caso dalla prima collection e lo aggiungo alla seconda. Per capirci qualcosa tipo questo:
    codice:
            Dim i, j As Integer
            Dim r As New Random
    
            'creo la collection iniziale
            Dim mazzo1 As New List(Of Integer)
    
            'popolo la collection
            For i = 1 To 112
                mazzo1.Add(i)
            Next
    
            'creo la collection di destinazione
            Dim mazzo2 As New List(Of Integer)
    
            For i = 1 To 112
                'indice casuale all'interno di mazzo1
                j = r.Next(0, mazzo1.Count)
    
                'sposto l'elemento
                mazzo2.Add(mazzo1(j))
                mazzo1.RemoveAt(j)
            Next
    Chi non cerca trova.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    252
    perfetto funziona

    ora sto provando ad assegnare ogni singolo numero alla text di un button
    però essendo 112 button non vorrei riempirli uno ad uno se hanno il .text =""
    ossia

    if button1.text ="" then
    button1.text = mazzo2.....
    end if

    prima in vb6 duplicavo i button e impostavo nella programmazione

    button(index) = ma si può fare o c'è una cosa diversa?

    grazie

  4. #4
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,536

    Re: vb2010 numeri random non ripetuti

    ma questo algoritmo lo dovrai usare per più giocatori? se si allora devi memorizzare anche le carte che hai già dato in precedenza...

    adesso io ho immaginato ad esempio che tu faccia un gioco di ramino, gli altri giocatori rischiano di ricevere le carte già date al giocatore precedente.
    per evitare ciò è necessario memorizzare le carte già date a livello condiviso per tutte le chiamate a quel metodo (quindi diciamo un campo a livello di classe).

    questo è quello che ho utilizzato io per un pokerroom (poker all'italiana scritto in c#) :
    codice:
    private int[] DaiCarte(ref Tavoli tavolo, int IDgiocatore)
            {
                int idTavolo = tavolo.ID;
                int[] result = new int[5];
                int min = (10 - tavolo.Giocatori.Count) * 4;//questo serve per adeguare il numero di carte al numero di giocatori al tavolo per mano(necessario per il poker all'italiana)
    
                for (int i = 0; i < 5; i++)
                {
                    result[i] = Carta(tavolo.Carte.ToList(), min);//chiamo il metodo che da la carta passando le carte già "uscite" è il numero di giocatori present al tavolo (in gioco oppure fuori gioco il numero non cambia in una mano)
                    Carte ca = new Carte();//creo una nuova carta
                    ca.Valore = result[i];//attribuisco il valore numerico
                    ca.ID_Tavolo = tavolo.ID;// ci possono essere più tavoli e quindi ne memorizzo l'id
                    ca.ID_Giocatore = IDgiocatore;// memorizzo a chi è stata attribuita la carta
                    ca.Eliminata = false;// questo serve quando viene cambiata la carta per evitare che venga richiamata in gioco
                    ca.Data = DateTime.Now;// è un po complesso spiegare il perchè ma a me serviva...
                    tavolo.Carte.Add(ca);//aggiungo la carta alla lista delle carte già uscite
                }
                return result;
            }
    
            private int Carta(List<Carte> CarteInGioco, int min)
            { 
                int random = -1;
                bool ok = false;
                while (!ok)//imposto un ciclo che determina se la carta è ok (non in uso)
                {
                    Random r = new Random(DateTime.Now.Millisecond);
                    random = r.Next(0, 52);
                    Carte c = null;
                    try
                    {
                        c = CarteInGioco.Single(p => p.Valore == random);
                    }
                    catch { }
                    if (c == null&&(random<4|random>=min))//controllo se esiste già la carta nel mazzo (in caso di carta null non esiste) e che sia minore del minimo (esempio se si gioca in 4 la carta minore è il 6) ad esclusione ovviamente delle prime 4 (0-3) che rappresentano gli assi che sono sempre presenti
                    {
                        ok = true;//esco dal ciclo 
                    }
                }
                return random;//restituisco la carta
            }
    dovevo migliorare il tutto (era una prova anche se devo dire che la velocità è maggiore di quanto mi aspettavo) ma poi mi sono fermato perchè non sono ancora arrivate le autorizzazioni dal monopolio e il cliente è in stand by.

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    252
    ti ringrazio cercherò di tradurlo per il vb 2010

    però mi chiedevo posso associare ai button che ho nel form un index per richiamarli tramite variabile che bambia?

    mi spiego meglio.
    credo sia byval sender o qualcosa di simile

    in vb6 usavo impostare l'index nelle proprietà
    qui cosa si usa?

    un esempio sarebbe di aiuto grazie

  6. #6
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,536
    Originariamente inviato da garzone
    ti ringrazio cercherò di tradurlo per il vb 2010

    però mi chiedevo posso associare ai button che ho nel form un index per richiamarli tramite variabile che bambia?

    mi spiego meglio.
    credo sia byval sender o qualcosa di simile

    in vb6 usavo impostare l'index nelle proprietà
    qui cosa si usa?

    un esempio sarebbe di aiuto grazie
    spiegami meglio cosa vuoi fare.

    per caso hai una griglia con dei bottoni a mo di solitario?

  7. #7
    Originariamente inviato da garzone
    ti ringrazio cercherò di tradurlo per il vb 2010

    però mi chiedevo posso associare ai button che ho nel form un index per richiamarli tramite variabile che bambia?

    mi spiego meglio.
    credo sia byval sender o qualcosa di simile

    in vb6 usavo impostare l'index nelle proprietà
    qui cosa si usa?

    un esempio sarebbe di aiuto grazie
    Fin dalla prima versione di VB.NET gli array di controlli non sono più supportati. Almeno non nel modo utilizzato in VB6. Come diceva U235 dovresti spiegare meglio quello che vuoi fare, non è che si sia capito molto sinceramente...
    Chi non cerca trova.

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    252
    volevo assegnare alla text dei vari button i valori dei numeri sorteggiati dal random

    i numeri li ho nella variabile mazzo2

    i button sono 122

    volevo assegnare con un loop i vari valori ma se le button si chiamano b1,b2,b3,b4,b122

    non voglio popolarli uno ad uno

  9. #9
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,536
    quando attribuisci il numero a mazzo2 imposta anche Text nel bottone :

    codice:
    For i = 1 To 112
                'indice casuale all'interno di mazzo1
                j = r.Next(0, mazzo1.Count)
    
                'sposto l'elemento
                mazzo2.Add(mazzo1(j))
                mazzo1.RemoveAt(j)
                Try
    		Dim bottone As Control() = Me.Controls.Find("B" + i, False)
    		bottone(0).Text = mazzo1(j).ToString()
    	    Catch
    
    	   End Try
    Next
    EDIT : era inutile fare due cicli uguali e l'ho inserito nel tuo

  10. #10
    Visual Basic 2008 - Numeri casuali non ripetuti

    Salve, perché non funziona questo algoritmo? Dov'è l'errore? Dovrei ottenere numeri dall'1 al 6 ripetuti una sola volta, ma ottengo sempre dei numeri doppi, tripli, ecc. Aiutatemi a risolvere il problema per favore!

    Dim i, i_fine, j AsInteger'Contatori
    Dim numeri(6) AsInteger'Vettore dei numeri

    'Azzero il vettore


    For i = 1 To 6

    numeri(i) = 0

    Next i


    'Inizializzo il generatore di numeri casuali


    Randomize()


    'Genero il primo numero del vettore


    numeri(1) = Int(Rnd() * 6) + 1


    'Carico il resto del vettore con numeri casuali non ripetuti


    For j = 2 To 6

    i_fine = j - 1

    For i = 1 To i_fine

    Do

    Randomize()

    numeri(j) = Int(Rnd() * 6) + 1

    LoopUntil (numeri(j) <> numeri(i))

    Next i

    Next j


    'Mostro i risultati ottenuti nelle rispettive label


    Label1.Text = numeri(1)

    Label2.Text = numeri(2)

    Label3.Text = numeri(3)
    Label4.Text = numeri(4)
    Label5.Text = numeri(5)
    Label6.Text = numeri(6)

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.