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

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

Ερώτηση

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

Θέλω να γεμίσω ένα μονοδιάστατο πίνακα 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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

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

  • 0

Αυτό δε ισχύει έτσι κι αλλιώς; Tο i το ξεκινάω από 1 στο πρώτο βρόγχο και το j από 0 στο δεύτερο

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

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

 

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

'Kwdikas'
}

 

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

 

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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Καλά μεγάλη μαλακία-κόλλημα μου... Σορρυ

 

Μετά τρέχει αλλά φαίνεται σαν να υπάρχει ατέρμων βρόγχος...

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

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

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

  • Like 1

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

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

 

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

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

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

 

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

 

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

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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

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

 

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

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

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

 

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

 

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

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

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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Ας βάλω και εγώ κώδικα από αντίστοιχο θέμα (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;
	}
}

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

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

 

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

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

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

 

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

 

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

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

 

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

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

 

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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

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

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

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

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

Εγγραφείτε για έναν νέο λογαριασμό

Σύνδεση

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

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

Χρήσιμες πληροφορίες

Με την περιήγησή σας στο insomnia.gr, αποδέχεστε τη χρήση cookies που ενισχύουν σημαντικά την εμπειρία χρήσης.