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/C++ - Random array
Forum - C/C++ - Random array

Avatar
edo1493 (Normal User)
Newbie


Messaggi: 11
Iscritto: 02/04/2010

Segnala al moderatore
Postato alle 20:46
Sabato, 03/04/2010
Sto elaborando un programma in C sul gioco del BlackJack, ho soltanto un piccolo problema..
Le carte le ho posizionate in un vettore [4][13], per estrarre le carte faccio il random delle linee e delle colonne e stampo la carta..
Il problema è che non so come fare il random delle colonne in modo tale che non mi estragga elementi già usciti..

Il random lo eseguo in questo modo:

row = rand()%4;
column = rand()%13;

deck[row][column];

rand in qualche modo deve capire che 12 già la estratto e non lo deve estrarre finche non viene azzerato tutto.

Potrei creare un array, dove inserire tutti i risultati di column e poi confrontare ogni risultato con l'array, se il risultato è presente rieseguo il random...?

PM Quote
Avatar
GuglielmoS (Ex-Member)
Pro


Messaggi: 114
Iscritto: 27/11/2009

Segnala al moderatore
Postato alle 20:53
Sabato, 03/04/2010
Testo quotato

Postato originariamente da edo1493:

Sto elaborando un programma in C sul gioco del BlackJack, ho soltanto un piccolo problema..
Le carte le ho posizionate in un vettore [4][13], per estrarre le carte faccio il random delle linee e delle colonne e stampo la carta..
Il problema è che non so come fare il random delle colonne in modo tale che non mi estragga elementi già usciti..

Il random lo eseguo in questo modo:

row = rand()%4;
column = rand()%13;

deck[row][column];

rand in qualche modo deve capire che 12 già la estratto e non lo deve estrarre finche non viene azzerato tutto.

Potrei creare un array, dove inserire tutti i risultati di column e poi confrontare ogni risultato con l'array, se il risultato è presente rieseguo il random...?


Potresti semplicemente fare un ciclo che continua a generare una posizione di una carta in modo casuale, finchè non viene trovata una posizione valida all'interno del "deck".
Esempio:
Codice sorgente - presumibilmente C/C++

  1. do {
  2.     row = rand()%4;
  3.     column = rand()%13;
  4. } while(deck[row][column] != VALORE_PREFISSATO);
  5. // dove VALORE_PREFISSATO indica se la carta è già stata estratta o meno
  6. // ... poi in deck[row][column] ci inserisci il valore della carta
  7. //     che sarà ad esempio: (row*10) + (column)

  

PM Quote
Avatar
edo1493 (Normal User)
Newbie


Messaggi: 11
Iscritto: 02/04/2010

Segnala al moderatore
Postato alle 23:00
Sabato, 03/04/2010
Dovrei trovare qualcosa di migliore, considerando che la soluzione la devo usare sia per il mazziere che per il giocatore, la funzione che gestisce il mazziere usa già un do while, penso che un do while dentro un do while, vada in conflitto...provo con quella di salvare i dati nell'array, ma non sono sicuro..altri suggerimenti?

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 3:30
Domenica, 04/04/2010
un vecchio algoritmo, ottimo per il tuo problema è il seguente:

- N = numero di carte

- For i=1 to N
- prendi un indice X random, compreso tra i ed N
- scambia la carta di posto X con la carta di posto i
- Next i


il mazzo così scombinato non ripete mai due volte la stessa carta.
Puoi memorizzare il mazzo scombinato da qualche parte, e leggendolo da 0 fino ad N-1 avrai la tua sequenza di numeri random che non si ripetono mai...

PM Quote
Avatar
edo1493 (Normal User)
Newbie


Messaggi: 11
Iscritto: 02/04/2010

Segnala al moderatore
Postato alle 10:43
Domenica, 04/04/2010
Per il giocatore ho risolto in questo modo:
Codice sorgente - presumibilmente C/C++

  1. do {
  2.  
  3. row = rand() % 4;
  4.  
  5. column = rand() % 13;
  6.  
  7. if(sDeck[row][column] == 1) {
  8.  
  9. sentinella = 1;
  10.  
  11. }
  12.  
  13. else {
  14. sentinella = 0;
  15. }
  16.  
  17. } while (sentinella == 1);
  18.  
  19. sDeck[row][column] = 1;


Funziona! Per il mazziere proverò la seconda soluzione..

Avrei un altro piccolo problema, ogni volta che l'utente preme 5 dovrei riazzerare tutti i valori, (c'è uno scanf nel main), ora dovrei trovare un modo per azzerare static int sDeck ogni volta che l'utente preme 5.

Codice sorgente - presumibilmente C/C++

  1. if(choice == 5) {
  2. richiamo funzione( senza nulla, che deve andare a modificare un vettore in un altra funzione...??) }


PM Quote
Avatar
edo1493 (Normal User)
Newbie


Messaggi: 11
Iscritto: 02/04/2010

Segnala al moderatore
Postato alle 11:22
Domenica, 04/04/2010
Ho risolto anche il mazziere!!
Codice sorgente - presumibilmente Plain Text

  1. do{
  2.  
  3. row = rand() % 4;
  4.  
  5. column = rand() % 13;
  6.  
  7. } while(sDeck[row][column] == 1);
  8.  
  9. sDeck[row][column] = 1;



Ora mi serve una funzione che venga lanciata nel main, per azzerare i due array delle due funzioni...

PM Quote