Προς το περιεχόμενο

C: Δημιουργία Πίνακα με τυχαίους αριθμούς


Arctic

Προτεινόμενες αναρτήσεις

Καλησπέρα σας παιδιά, 

Θέλω να γεμίσω ένα μονοδιάστατο πίνακα 5 κελιών με αριθμούς τους αριθμούς 0,1,2,3,4(δηλαδή να μη υπάρχει σε δύο κελιά ίδιος αριθμός) 

Το κομμάτι του κώδικα είναι παρακάτω...μου εμφανίζει όμως συνέχεια τους ίδιους αριθμούς με την ίδια σειρά :(  Τι μαλακία κάνω; 


#include <stdio.h>

#include <time.h>
int board[5],i,j,flag,temp;
int main()
{
  
board[0]=rand()%4;

    for (i=1;i<=4;i++)

    {
        
     
   
        do
       {   
           flag=0;
             temp=rand()%4;            
             for (j=0;j==i;j++)
             {
                 if (temp==board[j])
                 {
                     
                     flag=1;
                     break;
                 }
                  
             }   
               
        }
        while(flag==1);     
        board[i]=temp;
        
           }
     for (i=0;i<=4;i++)
     {
     printf("%d\n",board[i]);
     }
     system ("PAUSE")
}

 

Ακόμη θέλω να εμφανίσω από δομή και δε εμφανίζει αυτό που έχω αποθηκεύσει, εμφανίζει αυτό στη συνημμένη εικόνα.

  

post-214449-0-22453000-1360420436_thumb.png

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Όχι δεν ισχύει το i είναι δείκτης που σου υποδηλώνει πόσα στοιχεία έχουν εισαχθεί ενώ το j σου υποδηλώνει πόσα πρέπει να κάνω έλεγχο για την εύρεση διπλοστοιχείων

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

μου φαίνεται δε ξέρεις τι κάνει το for loop

 

for (j=0;j<i;j++){

'Kwdikas'
}

 

j=0, οσο j<i τρεξε το 'Kwdikas' και αύξησε το j κατα ένα.

 

Αμά το αλλάξεις τι σφάλμα σου βγάζει? 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το κανείς "λίγο ανάποδα" φίλε...

Μια καλή ιδέα θα ήταν να γεμίζεις τον πίνακα με {0, 1, 2, 3, 4} και μετά να κάνει swap το κάθε στοιχείο με ένα άλλο τυχαίο. (κάπως έτσι δουλεύει νομίζω και η Collections.shuffle() της java)

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ένας άλλος τρόπος για σχετικά "αμερόληπτο" ανακάτεμα .

 

Οι 5 αριθμοί έχουν 5!=120 συνδυασμούς.  

α) διάλεξε έναν τυχαίο αριθμό  0 - 119 δλδ rand()%120

β) βάλε στον πίνακα τον συνδυασμό που αντιστοιχεί σε αυτό το νούμερο.

 

Tο n! πρέπει να χωράει σε int η long  (να μην έχεις πολλά κελιά )

 

Για το β) δεν χρειάζεται να απαριθμήσεις ένα-ένα τους συνδυασμούς .

δες και εδώ  http://projecteuler.net/problem=24

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ένας άλλος τρόπος για σχετικά "αμερόληπτο" ανακάτεμα .

 

Οι 5 αριθμοί έχουν 5!=120 συνδυασμούς.  

α) διάλεξε έναν τυχαίο αριθμό  0 - 119 δλδ rand()%120

β) βάλε στον πίνακα τον συνδυασμό που αντιστοιχεί σε αυτό το νούμερο.

 

Tο n! πρέπει να χωράει σε int η long  (να μην έχεις πολλά κελιά )

 

Για το β) δεν χρειάζεται να απαριθμήσεις ένα-ένα τους συνδυασμούς .

δες και εδώ  http://projecteuler.net/problem=24

Σαν ιδεα ειναι καλο, αλλα σαν υλοποιηση καπως περιπλοκο, εκτος αν κανεις "καταχρηση" του %

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ας βάλω και εγώ κώδικα από αντίστοιχο θέμα (shuffle)..

 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define BOARDSIZE 10

void swap(int *, int *);
void populateBoard(int *, int);
void shuffleBoard(int *, int);
void printBoard(int *, int);
int continueOrStop(void);

int main(int argc, char *argv[])
{
	srand ((unsigned)time(NULL));
	int board[BOARDSIZE];

	printf("Populating board...\n");
	populateBoard(board, BOARDSIZE);
	printBoard(board, BOARDSIZE);

	printf("Shuffling...\n");
	shuffleBoard(board, BOARDSIZE);
	printBoard(board, BOARDSIZE);

	while(continueOrStop())
	{
		printf("Shuffling...\n");
		shuffleBoard(board, BOARDSIZE);
		printBoard(board, BOARDSIZE);
	}
}

void swap(int *i, int *j)
{
	*i += *j;
	*j = *i - *j;
	*i -= *j;
}

void populateBoard(int board[], int boardSize)
{
	int i;
	for(i = 0; i < boardSize; i++)
		board[i] = i;
}

void shuffleBoard(int board[], int boardSize)
{
	int numberA, numberB;
	for(numberA = 0; numberA < boardSize; numberA++)
	{
  		numberB = rand() % boardSize;
  		if(numberB != numberA)
    			swap(&board[numberA], &board[numberB]);
	}

}

void printBoard(int board[], int boardSize)
{
	int i;

	for (i = 0; i < boardSize; i++)
		printf("%d ", board[i]);
	printf("\n");
}

int continueOrStop(void)
{
	printf("Continue (y/n)?: ");

	while (1)
	{
		char c = getchar();
		if (c == 'y' || c == 'Y')
			return 1;
		else if (c == 'n' || c == 'N')
			return 0;
	}
}
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ένας άλλος τρόπος για σχετικά "αμερόληπτο" ανακάτεμα .

 

Οι 5 αριθμοί έχουν 5!=120 συνδυασμούς.  

α) διάλεξε έναν τυχαίο αριθμό  0 - 119 δλδ rand()%120

β) βάλε στον πίνακα τον συνδυασμό που αντιστοιχεί σε αυτό το νούμερο.

 

Tο n! πρέπει να χωράει σε int η long  (να μην έχεις πολλά κελιά )

 

Για το β) δεν χρειάζεται να απαριθμήσεις ένα-ένα τους συνδυασμούς .

δες και εδώ  http://projecteuler.net/problem=24

 

Έξυπνο για να θυμόμαστε λίγο και τη Συνδυαστική,αλλά κατάχρηση όσο αφορά τον προγραμματισμό.

Σκέψου να είχες πίνακα με 1000 αριθμούς...1000!

 

Η λύση του Nilos με το shuffle θεωρώ είναι το πιο εύκολο και ταχύ.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...