Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - numeri sempre diversi in un array bidimensionale
Forum - C# / VB.NET - numeri sempre diversi in un array bidimensionale - Pagina 2

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
alimuzzy (Normal User)
Rookie


Messaggi: 28
Iscritto: 24/02/2009

Segnala al moderatore
Postato alle 2:40
Lunedì, 24/05/2010
Ciao Totem
Credimi le sto provando tutte, e il listato che secondo me si avvicina di piu e questo:

Module Module1
    Sub Main()

        Dim i As Integer
        Dim j As Integer
        Dim conteggio As Integer
        Dim rand As New Random
        Dim numero As Integer
        Dim ArrA As Integer
        Dim ArrB As Integer

        Console.Write("Inserisci la prima lunghezza dell'array: ")
        ArrA = Console.ReadLine
        Console.WriteLine()
        Console.Write("Inserisci la seconda lunghezza dell'array: ")
        ArrB = Console.ReadLine
        Console.WriteLine()

        Dim diverso(ArrA, ArrB) As Integer

        For i = 0 To ArrA - 1
            For j = 0 To ArrB - 1
                diverso(i, j) = 0
            Next
        Next

        numero = rand.Next(1, 10)

        conteggio = 0

        While conteggio < ArrA * ArrB
            For i = 0 To ArrA - 1
                For j = 0 To ArrB - 1
                    If numero <> diverso(i, j) Then
                        diverso(i, j) = numero
                        conteggio += 1
                    End If
                    numero = rand.Next(1, 10)
                Next
            Next
        End While

        For i = 0 To ArrA - 1
            For j = 0 To ArrB - 1
                Console.Write(diverso(i, j).ToString("00") & " ")
            Next
            Console.WriteLine()
        Next
        Console.ReadLine()

    End Sub
End Module

Ho fatto un range da 1 a 10 per avere una visuale piu ristretta di numeri a caso
e da come puoi vedere i numeri non sono sempre differenti..
Ma dove sbaglio?????8-|8-|
Grazie ;)

Ultima modifica effettuata da alimuzzy il 24/05/2010 alle 2:42
PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 12:55
Lunedì, 24/05/2010
Testo quotato

Postato originariamente da alimuzzy:

Ciao Totem
Credimi le sto provando tutte, e il listato che secondo me si avvicina di piu e questo:

Module Module1
    Sub Main()

        Dim i As Integer
        Dim j As Integer
        Dim conteggio As Integer
        Dim rand As New Random
        Dim numero As Integer
        Dim ArrA As Integer
        Dim ArrB As Integer

        Console.Write("Inserisci la prima lunghezza dell'array: ")
        ArrA = Console.ReadLine
        Console.WriteLine()
        Console.Write("Inserisci la seconda lunghezza dell'array: ")
        ArrB = Console.ReadLine
        Console.WriteLine()

        Dim diverso(ArrA, ArrB) As Integer

        For i = 0 To ArrA - 1
            For j = 0 To ArrB - 1
                diverso(i, j) = 0
            Next
        Next

        numero = rand.Next(1, 10)

        conteggio = 0

        While conteggio < ArrA * ArrB
            For i = 0 To ArrA - 1
                For j = 0 To ArrB - 1
                    If numero <> diverso(i, j) Then
                        diverso(i, j) = numero
                        conteggio += 1
                    End If
                    numero = rand.Next(1, 10)
                Next
            Next
        End While

        For i = 0 To ArrA - 1
            For j = 0 To ArrB - 1
                Console.Write(diverso(i, j).ToString("00") & " ")
            Next
            Console.WriteLine()
        Next
        Console.ReadLine()

    End Sub
End Module

Ho fatto un range da 1 a 10 per avere una visuale piu ristretta di numeri a caso
e da come puoi vedere i numeri non sono sempre differenti..
Ma dove sbaglio?????8-|8-|
Grazie ;)



Ciao Alimuzzi o visto il tuo codice, forse intendi che ti compaiono numeri ripetuti ?

se si,  forse manca un controllo in tal senso, mi sono imbattuto anche io in questo

genere di problematiche, ma una volta che le risolvi ne hai molta soddisfazione,

io non sono un maestro della programmazione, quindi non mi permetto di darti dei

consigli che potrebbero essere errati, comunque come ho fatto io puoi vedere come

anno risolto questo genere di problemi altri programmatori, che hanno esposto il

loro codice in merito a queste tematiche, un saluto da (Ultimo) :k:


If ok Then GOTO Avanza else GOTO Inizia

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 20:58
Lunedì, 24/05/2010
Testo quotato

Postato originariamente da alimuzzy:
        numero = rand.Next(1, 10)

        conteggio = 0

        While conteggio < ArrA * ArrB
            For i = 0 To ArrA - 1
                For j = 0 To ArrB - 1
                    If numero <> diverso(i, j) Then
                        diverso(i, j) = numero
                        conteggio += 1
                    End If
                    numero = rand.Next(1, 10)
                Next
            Next
        End While



Allora, questa è la parte di codice da analizzare. Avrai già capito che anche questa è sbagliata, e mi sembra evidente il perchè. In sostanza tu estrai un numero casuale intero nell'intervallo [1,9]. Per ArrA*ArrB volte, scansioni tutta la matrice. La prima volta, ossia quando entri nel while dopo l'inizializzazione di conteggio, hai che tutti i valori della matrice sono 0, poiché li hai impostati poco prima e 0 è evidentemente diverso da qualsiasi numero in [1,9], perciò la matrice viene popolata con numeri casuali (non necessariamente diversi). In particolare, hai che il codice dentro l'if viene eseguito esattamente ArrA*ArrB volte, poiché, come già detto, la condizione numero<>diverso(i,j) è sempre vera. Poiché, quindi, alla fine dei for, conteggio=ArrA*ArrB, esci dal while, rendendo il tutto inutile.

E' evidente che non stai prendendo la via più semplice, oppure che, se ti dessi una matrice, non sapresti dire se contiene numeri uguali (penso che sia la prima ipotesi...). Semplicemente, per ogni valore estratto, ricontrolli tutti i precedenti per verificare se tale valore esiste già: se esiste, lo modifichi o lo riestrai, altrimenti passi al successivo.

P.S.: affinché in una matrice esistano solo numeri interi distinti appartenenti a [1,9] è necessario che ArrA*ArrB <= 9 (quindi sono ammesse solo 1x9, 2x4, 3x3 e le relative trasposte).

PM Quote
Avatar
alimuzzy (Normal User)
Rookie


Messaggi: 28
Iscritto: 24/02/2009

Segnala al moderatore
Postato alle 21:59
Lunedì, 24/05/2010
Ciao Totem.
Le ho provate tutte, infatti quello che non riesco a fare e  dire al programma di leggere il numero precedente.
in una matrice bidimensionale arr(arra, arrb), il precedente della colonna è
arr(arra, arrb - 1)??
Il problema e quello, ho cercato e ricercato ovunque su google e nei vari testi di programmazione ma non ho trovato nulla.
tra l'altro ho provato anche con arr(arra, arrb - 1), niente... non funzionaaaaaa.. hehehehe
Non mollo....:heehee:

Ultima modifica effettuata da alimuzzy il 24/05/2010 alle 22:00
PM Quote
Avatar
alimuzzy (Normal User)
Rookie


Messaggi: 28
Iscritto: 24/02/2009

Segnala al moderatore
Postato alle 0:33
Martedì, 25/05/2010
Dimenticavo di ringraziare Ultimo per il suggerimento riguardo al controllo, in effetti manca proprio il controllo delle ultime estrazioni.
Cercherò di studiare come leggere da una matrice bidimensionale il valore precedente di un indice cosi da poter fare il paragone con l'ultimo numero estratto.
Forse impiego troppo tempo alla ricerca sui forum e su google piuttosto di studiare:asd::asd:
Grazie cmq per l'interessamento Ultimo:k::k:

PM Quote
Avatar
Alfonso (Ex-Member)
Guru


Messaggi: 688
Iscritto: 30/09/2009

Segnala al moderatore
Postato alle 12:43
Martedì, 25/05/2010
Ti riporto un post di 'nessuno' di qualche giorno fa che dà una soluzione su come ottenere numeri casuali senza ripetizioni.

http://www.pierotofy.it/pages/extras/forum/6/1005436-visua ...
Lo modifico per adattarlo al tuo caso, per non farti fuorviare dal mazzo di carte.

Inserisci tutti i numeri in un vettore di strutture ed estrai un numero compreso tra il primo e l'ultimo elemento. Quando hai scelto un numero, sposta l'ultimo elemento dell'array nel posto che hai scelto in precedenza e riduci di una unità i numeri totali da poter scegliere.

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 21:52
Martedì, 25/05/2010
Ci sono miliardi di soluzioni già pronte, e decine solo su questo forum. Alimuzzy vuole provare da solo a risolvere il problema prima di ricorrere ad una soluzione.

E ti correggo, non ho detto il precedente, ma i precedenti. Il precedente potrebbe anche essere diverso, ma se anche tutti quelli che vengono prima non lo sono, allora esistono numeri ripetuti.
Il precedente di A(i,j) è A(i,j-1) solo se j>0, altrimenti è A(i-1,col-1), con col numero di colonne. Il precedente esiste solo se i>0 e j>0, o, se vuoi una cosa ciclica può essere A(righe-1,col-1).
Ma tutto questo non serve per il tuo programma.

PM Quote
Avatar
alimuzzy (Normal User)
Rookie


Messaggi: 28
Iscritto: 24/02/2009

Segnala al moderatore
Postato alle 13:58
Domenica, 30/05/2010
Prendendo esempi da altri post alla fine ero riuscito a trovare la soluzione utilizando il modulo list, arrivando a questo:

Codice sorgente - presumibilmente VB.NET

  1. For i = 1 To 90
  2.             numero.Add(i)
  3.         Next
  4.  
  5.         Randomize()
  6.         For i = 0 To ArrA - 1
  7.             For j = 0 To ArrB - 1
  8.                 valori = rand.Next(numero.Count - 1)
  9.                 diverso(i, j) = numero(valori)
  10.                 numero.RemoveAt(valori)
  11.             Next
  12.         Next



Ma il punto e che a tutt'ora non sono riuscito, nemmeno utilizzando il modulo list, a fare il paragone tra i valori estratti e quelli ancora da estrarre.

Codice sorgente - presumibilmente VB.NET

  1. For i = 0 To ArrA - 1
  2.             For j = 0 To ArrB - 1
  3.                 estratto = rand.Next(1, 20)
  4.                 If Not contenitore.Contains(estratto) Then
  5.                     contenitore.Add(estratto)
  6.                     For Each estratto In contenitore
  7.                         estrazione(i, j) = estratto
  8.                     Next
  9.                 End If
  10.             Next
  11.         Next



se dovessi fare un estrazione di 2 righe e 6 colonne ad esempio il programma mi restituisce non 12 valori ma 10 e in quelli mancanti mi inserisce 0.

Non ce la faccio + ho provato mille soluzioni ma si vede che faccio lo stesso sbalgio in modi differenti :asd::asd:

Help..... me :rofl::rofl:

Ultima modifica effettuata da alimuzzy il 30/05/2010 alle 14:10
PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo