freestuff.gr αρχική σελίδα
 FAQFAQ    ΑναζήτησηΑναζήτηση   Λίστα ΜελώνΛίστα Μελών   Ομάδες ΜελώνΟμάδες Μελών   <b>Εγγραφή Μέλους</b>Εγγραφή Μέλους 
 ΠροφίλΠροφίλ   Επιλογές μέλους Επιλογές   Τα bookmarks μου Τα bookmarks μου   Προσωπικά μηνύματαΠροσωπικά μηνύματα 
  διαφήμιση  

Καλώς ήρθατε στο forum μας! Για να συμμετάσχετε στις συζητήσεις θα πρέπει να είσαστε μέλος. Γίνετε μέλος τώρα!.

τυχαία αριθμοί σε συγκεκριμένο διάστημα (C language)


 Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » Γλώσσες Προγραμματισμού » C, C++
Moderators:  Super-Moderators, WebDev Moderators
Εισαγωγή νέου Θέματος   Απάντηση στο Θέμα Σελίδα 1 από 1 [11 Μηνύματα]      Bookmarks Tags: languageδιάστημα Mark the topic unread :: Προηγούμενο θέμα :: Επόμενο θέμα
ΑποστολέαςΜήνυμα
koszerb


Μέλος από: 22 Νοε 2008
Μηνύματα: 8

View users profile
ΜήνυμαΣτις: 13 Απρ 2009 17:38    Θέμα: τυχαία αριθμοί σε συγκεκριμένο διάστημα (C language)
Περιγραφή θέματος: τυχαία αριθμοί σε συγκεκριμένο διάστημα (C language)
Απάντηση με παράθεση  Mark this post and the followings unread

Καλησπέρα!
Αν έχω ένα διάστημα ακεραίων αριθμών π.χ. [1-40], πώς μπορώ να επιλέξω κάθε αριθμό μία φορά, αλλά με τυχαία σειρά;;;

Για να εξηγήσω τι θέλω να κάνω:
έχω ένα πίνακα 40χ40, αρχικοποιημένο με 0.
Θέλω να βάλω 40 άσσους (1) σε συγκεκριμένες θέσεις,
δηλ. να βάλω ένα άσσο σε κάθε στήλη (οποσδήποτε) αλλά να μην συμπέσουν στην ίδια σειρά ή διαγώνιο.

Π.χ. έστω ένας μικρότερος πίνακας 4χ4, αυτό που θέλω να πετύχω είναι κάτι σαν αυτό
0100
0001
1000
0010
όπου βάζω ένα 1 σε κάθε στήλη (ξεκινώντας το loop από την πρώτη, δεύτερη κτλ στήλη), αλλά η γραμμή επιλέγεται τυχαία στο διάστημα [1-4]....

κάθε βοήθεια δεκτή
ευχαριστώ
alex599


Μέλος από: 17 Δεκ 2008
Βοηθήματα: 3
Μηνύματα: 66

Περιοχή: Πάτρα
View users profile Send email to user
ΜήνυμαΣτις: 13 Απρ 2009 20:16    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

για τυχαίους αριθμούς σε διάστημα [low,high] δοκίμασε τη συνάρτηση:

κώδικας:

int RandomInteger(int low, int high){
     int k;
     double d;
     d = (double) rand() / ((double)RAND_MAX + 1);
     k = (int) (d * (high - low + 1));
     return (low + k);
}


όπου πρέπει να κάνεις και αρχικοποίηση της γεννήτριας με το χρόνο μέσα στη main(). Ελπίζω να ξέρεις πως γίνεται αλλιώς εδώ είμαστε.

_________________
while(!dead()) ++knowledge;
bxenos


Μέλος από: 18 Αυγ 2008
Μηνύματα: 53

View users profile
ΜήνυμαΣτις: 14 Απρ 2009 03:08    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

το τυχαίο δεν έχει απαραίτητα θέση εδώ. Θέλεις trial and error μέθοδο. Iσως με recursion (αν το καταλαβαίνεις) ή με loops.

αντίστοιχα προβλήματα: βάλε 8 βασίλισσες σε σκακιέρα ή 8 άλογα σε σκακιέρα χωρίς να απειλούνται.
koszerb


Μέλος από: 22 Νοε 2008
Μηνύματα: 8

View users profile
ΜήνυμαΣτις: 14 Απρ 2009 10:49    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Ευχαριστώ για όλες τις απαντήσεις.

όσον αφορά τον alex
είχα σκεφτεί κάτι πιο απλό όπως το:
srand(time(null))
random=1+(rand()%40)

πώς σας φαίνεται αυτό; σωστό είναι;

όσον αφορά αυτή την απάντηση:
bxenos ανέφερε:
το τυχαίο δεν έχει απαραίτητα θέση εδώ. Θέλεις trial and error μέθοδο. Iσως με recursion (αν το καταλαβαίνεις) ή με loops.

αντίστοιχα προβλήματα: βάλε 8 βασίλισσες σε σκακιέρα ή 8 άλογα σε σκακιέρα χωρίς να απειλούνται.


Μήπως θα μπορούσατε να το εξηγήσετε λίγο παραπάνω; ίσως με κάποιο παράδειγμα;

Ευχαριστώ εκ των προτέρων...
bxenos


Μέλος από: 18 Αυγ 2008
Μηνύματα: 53

View users profile
ΜήνυμαΣτις: 14 Απρ 2009 11:34    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

http://www.math.utah.edu/~alfeld/queens/queens.html
bxenos


Μέλος από: 18 Αυγ 2008
Μηνύματα: 53

View users profile
ΜήνυμαΣτις: 14 Απρ 2009 11:38    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

en.wikipedia.org/wiki/Eight_queens_puzzle
alex599


Μέλος από: 17 Δεκ 2008
Βοηθήματα: 3
Μηνύματα: 66

Περιοχή: Πάτρα
View users profile Send email to user
ΜήνυμαΣτις: 14 Απρ 2009 12:27    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Σωστό και αυτό που σκέφτηκες...εγώ απλά σου έδωσα την γενική συνάρτηση...αυτό που έχεις εσύ έχει και κάποιους περιορισμούς αλλά για την περίπτωση σου θα δουλέψει μια χαρά.

_________________
while(!dead()) ++knowledge;
koszerb


Μέλος από: 22 Νοε 2008
Μηνύματα: 8

View users profile
ΜήνυμαΣτις: 14 Απρ 2009 22:07    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

bxenos ανέφερε:
http://www.math.utah.edu/~alfeld/queens/queens.html


Ευχαριστώ για τα παραδείγματα!
Ομως, αν κατάλαβα καλά, τοποθετούμε μία-μία τις βασίλισσες και ελέγχουμε αν υπάρχει απειλή.
Αυτό που θα ήθελα εγώ να κάνω είναι (αν συνδυάσουμε τις βασίλισσες με το πρόβλημά μου):

πρέπει να κατασκευάσουμε μια Αρχική κατάσταση τέτοια ώστε, να βάλουμε κάθε μία βασίλισσα Βi (i=1...40) στη θέση [γραμμή random, στήλη i],
όπου για τη στήλη ξεκινάμε πάντα από την πρώτη ως την τελευταία (δηλαδή, τις παίρνουμε όλες μία-μία με τη σειρά), ενώ η γραμμή επιλέγεται τυχαία στο διάστημα [1..40].
Αφού κατασκευαστεί η αρχική κατάσταση, μετά ελέγχουμε τις βασίλισσες ανά ζεύγη ώστε στο τέλος να καταλήξουμε να μην βρίσκονται στην ίδια γραμμή, στήλη, διαγώνιο.
Αν μετά από π.χ. ας πούμε 10 προσπάθειες δεν τα καταφέρουμε (επειδή απ΄ό,τι κατάλαβα είναι πάρα πολλοί οι συνδυασμοί που πρέπει να γίνουν), τότε να ξεκινούμε από την αρχή με μια νέα Αρχική κατάσταση, όπως περιγράφεται παραπάνω (ελπίζοντας για καλύτερη αρχική κατάσταση, σωστά;;;; ).

Τι είχα σκεφτεί εγώ για την κατασκευή της αρχικής κατάστασης:
εστω n=40 και random=1+(rand()%n)

κώδικας:
for (i=random; i<n; i++) //row
   for (j=1; j<n; j++) //column
      array[i][j]="B"  //στη θέση αυτή βάλε τη βασίλισσα


Αναρωτιέμαι λοιπόν, ποιο είναι το λάθος στο συλλογισμό μου και
πώς να το συνδέσω με την πρότασή σας για
"...trial and error μέθοδο. Iσως με recursion ... ή με loops... "

Μήπως θα μπορούσατε να μου του εξηγήσετε λίγο ακόμα;;; Τι ακριβώς πρέπει να κάνω δηλαδή; Μάλλον έχω μπερδευτεί!

Ευχαριστώ...
bxenos


Μέλος από: 18 Αυγ 2008
Μηνύματα: 53

View users profile
ΜήνυμαΣτις: 14 Απρ 2009 23:03    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

χρήση recursion:

κώδικας:

bool test(int level){
      //level = 0 για τον πρώτο ασσο, ... 39 για τον 40ο άσσο
      //για να φτάσαμε εδώ (επίπεδο level), είμαστε βέβαιοι ότι απο 0 εως level-1 είμαστε
      //εντάξυ (αν φυσικά υπάρχει το level-1)
      if(level>=40)
            return TRUE;//τους βάλαμε όλους σωστά, άρα το βρήκαμε
      for(όλες τις δυνατές θέσεις του άσσου της θέσης level){
            if(valid(0 εως level)){//αν μέχρι εδώ είμαστε καλά, πηγαινε στην επόμενη θέση:
                  if(test(level+1))
                       return TRUE;//βρέθηκε λύση με το τρέχον στήσιμο
                  //αλλιως το τρέχον στησιμο δεν έχει λύση, δοκίμασε το επόμενο
            }
      }
      return FALSE;
}

bool valid(int start,int end){ ελέγχει (χωρίς να κάνει μετακινήσεις) αν απο τη θέση start έως τη θέση end είναι σωστά τοποθετημένοι οι άσσοι (χωρις να πεφτουν σε ευθειες γραμμες).
}

int main(void){
    if(test(0)){
           τυπωσε τη λύση που βρέθηκε
    } else
           δεν βρεθηκε λύση
}


το τυχαίο δεν έχει θέση στον προγραμματισμό πραγματικών προβλημάτων. Αστο για παιχνίδια, screen saver και εφε...

Καλό Πάσχα!
alex599


Μέλος από: 17 Δεκ 2008
Βοηθήματα: 3
Μηνύματα: 66

Περιοχή: Πάτρα
View users profile Send email to user
ΜήνυμαΣτις: 15 Απρ 2009 11:20    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

νομίζω ότι το τυχαίο παρέα με έναν έλεγχο ίδιου δεδομένου μπορεί να λύσει το πρόβλήμα αλλά εντάξει μπορεί να κάνω και λάθος. Έλεγχο ίδιου δεδομένου εννοώ ότι στην τυχαιότητα έρχονται αριθμοί από το [1,40] ή καλύτερα το [0,39) και κάθε φορά αν ένας αριθμός έχει ήδη έρθει να γίνεται έλεγχος τις επόμενες φορές ώστε να μην ξαναέρθει! έτσι έχουμε τυχαιότητα και μοναδικότητα.

_________________
while(!dead()) ++knowledge;
koszerb


Μέλος από: 22 Νοε 2008
Μηνύματα: 8

View users profile
ΜήνυμαΣτις: 15 Απρ 2009 20:33    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Ευχαριστώ για τις υποδείξεις.
Θα τις μελετήσω και ίσως ξαναχρειαστώ τα σχόλιά σας...

Καλό Πάσχα!
Εμφάνιση Μηνυμάτων:   
Εισαγωγή νέου Θέματος   Απάντηση στο Θέμα Σελίδα 1 από 1 [11 Μηνύματα] Mark the topic unread :: Προηγούμενο θέμα :: Επόμενο θέμα
 Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » Γλώσσες Προγραμματισμού » C, C++
Τώρα είναι 05 Δεκ 2016 10:29 | All times are UTC + 2


Email This Page to Someone! add to Favorites

     Powered by p h p B B © 2001,2005 p h p B B Group
Για άμεση επικοινωνία με τον διαχειριστή του freestuff.gr στο email: freestuff.gr(παπάκι)gmail.com


Copyright © 1999-2013 Freestuff.gr All Rights Reserved  
Version Aegean, designed by N. Tsaganos