Η σελίδα μας αναβαθμίστηκε, γι' αυτό τον λόγο τα μέλη μας θα πρέπει να ζητήσουν νέο κωδικό πρόσβασης από την υπηρεσία "Αποστολή κωδικού πρόσβασης".
Εάν το email με τον νέο κωδικό δεν έρθει στο inbox κοιτάξτε και στο spam folder. Ο server είναι φρέσκος και δεν έχει το reputation που του αξίζει.

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

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: Super-Moderators, WebDev Moderators

Απάντηση
koszerb
Δημοσιεύσεις: 8
Εγγραφή: 22 Νοέμ 2008 17:51

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

Δημοσίευση από koszerb » 13 Απρ 2009 18:38

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

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

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

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

alex599
Δημοσιεύσεις: 66
Εγγραφή: 17 Δεκ 2008 01:11
Τοποθεσία: Πάτρα

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

Δημοσίευση από alex599 » 13 Απρ 2009 21:16

για τυχαίους αριθμούς σε διάστημα [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
Δημοσιεύσεις: 53
Εγγραφή: 18 Αύγ 2008 19:56

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

Δημοσίευση από bxenos » 14 Απρ 2009 04:08

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

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

koszerb
Δημοσιεύσεις: 8
Εγγραφή: 22 Νοέμ 2008 17:51

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

Δημοσίευση από koszerb » 14 Απρ 2009 11:49

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

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

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

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

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

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



alex599
Δημοσιεύσεις: 66
Εγγραφή: 17 Δεκ 2008 01:11
Τοποθεσία: Πάτρα

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

Δημοσίευση από alex599 » 14 Απρ 2009 13:27

Σωστό και αυτό που σκέφτηκες...εγώ απλά σου έδωσα την γενική συνάρτηση...αυτό που έχεις εσύ έχει και κάποιους περιορισμούς αλλά για την περίπτωση σου θα δουλέψει μια χαρά.
while(!dead()) ++knowledge;

koszerb
Δημοσιεύσεις: 8
Εγγραφή: 22 Νοέμ 2008 17:51

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

Δημοσίευση από koszerb » 14 Απρ 2009 23:07

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

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

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

Κώδικας: Επιλογή όλων

for &#40;i=random; i<n; i++&#41; //row
   for &#40;j=1; j<n; j++&#41; //column
      array&#91;i&#93;&#91;j&#93;="B"  //στη θέση αυτή βάλε τη βασίλισσα
Αναρωτιέμαι λοιπόν, ποιο είναι το λάθος στο συλλογισμό μου και
πώς να το συνδέσω με την πρότασή σας για
"...trial and error μέθοδο. Iσως με recursion ... ή με loops... "

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

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

Άβαταρ μέλους
bxenos
Δημοσιεύσεις: 53
Εγγραφή: 18 Αύγ 2008 19:56

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

Δημοσίευση από bxenos » 15 Απρ 2009 00:03

χρήση recursion:

Κώδικας: Επιλογή όλων

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

bool valid&#40;int start,int end&#41;&#123; ελέγχει &#40;χωρίς να κάνει μετακινήσεις&#41; αν απο τη θέση start έως τη θέση end είναι σωστά τοποθετημένοι οι άσσοι &#40;χωρις να πεφτουν σε ευθειες γραμμες&#41;.
&#125;

int main&#40;void&#41;&#123;
    if&#40;test&#40;0&#41;&#41;&#123;
           τυπωσε τη λύση που βρέθηκε
    &#125; else
           δεν βρεθηκε λύση
&#125;
το τυχαίο δεν έχει θέση στον προγραμματισμό πραγματικών προβλημάτων. Αστο για παιχνίδια, screen saver και εφε...

Καλό Πάσχα!

alex599
Δημοσιεύσεις: 66
Εγγραφή: 17 Δεκ 2008 01:11
Τοποθεσία: Πάτρα

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

Δημοσίευση από alex599 » 15 Απρ 2009 12:20

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

koszerb
Δημοσιεύσεις: 8
Εγγραφή: 22 Νοέμ 2008 17:51

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

Δημοσίευση από koszerb » 15 Απρ 2009 21:33

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

Καλό Πάσχα!

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες