frap Μάϊος 5, 2006 #21 Μάϊος 5, 2006 Αρχική απάντηση από D.J.AleXXX_gr [03-05-2006 22:44] int main(void)καταρχάς αυτό δεν γίνετεvoid main()είναι κανονικά. Άσχετο με το θέμα, αλλά η main επιστρέφει int. Η σωστή δήλωση είναι:int main (char ** argv, int argc)όπου argc ο αριθμός των ορισμάτων που δόθηκαν στη γραμμή εντολών και argv[x] τα ορισματα.Αν δεν μας ενδιαφέρουν τα ορίσματα ή η επιστροφή κωδικών λάθους, τότε μπορουμε να την δηλώσουμε σαν:void main (void)int main(void)void main(char** argv, int argc)Κάποιοι compilers ενδέχεται να έχουν warnings για τις παραπάνω δηλώσεις.Σχετικά με το θέμα, εγώ ακόμη δεν έχω καταλάβει αν το παλικάρι ζητά να γράψει εξαρχής μια γεννήτρια τυχαίων αριθμών από χ έως ψ (δεν είναι και τόσο δύσκολο...), ή να κάνει μια εφαρμογή των rand()/srand() που διαθέτει η standard βιβλιοθήκη της C.-K.
bold Μάϊος 5, 2006 #22 Μάϊος 5, 2006 ARVAS εψαξα λιγο και βρηκα αυτο ελπιζω να σε βοηθησει και γενηκα πολα απο εδω μπορουν να σου φερουν ιδεες(το σκεπτικο ειναι να παρεις τα δευτερολεπτα ή τα κλασματα δευτερολεπτων και να τα χρησιμοποιησεις ως τυχαιους αριθμους ....τη συγκεκριμενη τακτικη τη χρησιμοποιει η pascal αλλα μπορεις να το κανεις και σε C)
ARVAS Μάϊος 5, 2006 Author #23 Μάϊος 5, 2006 @bold Δεν ειναι κακο αν και δεν ξερω αν μπορω να χρησημοποιησω βιβλιοθηκες ωρας μιας και δεν την εχουμε χρησημοποιησει ποτε.το seed που αναφερει τι ειναι;@frap μια γενητρια 1000 αριθμων που να τους αποθηκευει σε πινακα.
bold Μάϊος 5, 2006 #24 Μάϊος 5, 2006 Αρχική απάντηση από ARVAS [Χθες, στις 19:38] ...το seed που αναφερει τι ειναι; random number seeds=αριθμος τυχαιας προελευσεις.....(νομιζω)
trendy Μάϊος 6, 2006 #25 Μάϊος 6, 2006 Αρχική απάντηση από D.J.AleXXX_gr//Program returns a random number#include <iostream&rt;#include <cstdlib&rt;using namespace std;int main(){ cout<<rand(); cout<<rand()%6; //Number between 0 and 5} Αυτό είναι c++, όχι c.#include <stdio.h>#include <stdlib.h>#define N 1000 /*tuxaioi ari8moi*/#define U 100 /*anw orio*/#define L 10 /*katw orio*/int main() { int Ci[N];/*pinakas apo8hkeushs*/ int i,j; /*metrhths*/ for ( i = 0 ; i < N ; i++ ) { j = rand() % (N+1);/*ari8mos sigoura mikroteros-isos N*/ if ( j < L ) Ci[i] = j + L;/*an mikroteros tou L...*/ else Ci[i] = j; } for ( i = 0 ; i < N ; i++ ) {/*tupwnei pinaka*/ printf ("%d ",Ci[i]); } printf("\n");}
ARVAS Μάϊος 6, 2006 Author #26 Μάϊος 6, 2006 @trendy:ευχαριστω πολυ ωραιο αλλα εχω μια απορια.Αν ειναι μικροτερος γιατι γινεται αυτο;;Ci = j + L;
trendy Μάϊος 6, 2006 #27 Μάϊος 6, 2006 Για να είναι ο ψευδοτυχαίος αριθμός εντός των ορίων που θέλεις.
ARVAS Μάϊος 6, 2006 Author #28 Μάϊος 6, 2006 Και γιατι δεν τον απορριπτω αλλα τον προσαρμοζω ωστε να μου κανει;;
trendy Μάϊος 6, 2006 #29 Μάϊος 6, 2006 Μπορείς και να τον απορρίψεις, αλλά όταν το έγραψα το θεώρησα βλακεία να γίνει έτσι γιατί θα θέλει νέα λούπα για να μη χαλάσει ο μετρητής i.
frap Μάϊος 6, 2006 #30 Μάϊος 6, 2006 Αρχική απάντηση από trendy [Σήμερα, στις 06:21] Μπορείς και να τον απορρίψεις, αλλά όταν το έγραψα το θεώρησα βλακεία να γίνει έτσι γιατί θα θέλει νέα λούπα για να μη χαλάσει ο μετρητής i. Υπάρχει και σοβαρότερος λόγος.Στη rand() (αν και εξαρτάται από την υλοποίηση του κάθε vendor, μερικές είναι πολύ άσχημες) θεωρητικά όλοι οι αριθμοί που μπορεί να δώσει έχουν την ίδια πιθανότητα. Αν τραβήξεις δηλαδή ένα πολύυυυ μεγάλο πλήθος αριθμών δεν θα δείς κάποιον να επαναλαμβάνεται ιδιαίτερα περισσότερο από κάποιον άλλο (ομοιόμορφη κατανομή).Αποδεικνύεται πως αν απλά απορρίπτεις αριθμούς για τον επόμενο που "σου κάνει", οι αριθμοί που τελικά παίρνεις δεν έχουν την ίδια πιθανότητα να αναδειχθούν (αν θυμάμαι καλά υπάρχει πρόβλημα στα όρια του διαστήματος...). Ενώ αν τους χρησιμοποιείς όλους μετατρέποντάς τους οι αριθμοί που προκύπτουν έχουν επίσης ομοιόμορφη κατανομή.-Κ.
frap Μάϊος 6, 2006 #31 Μάϊος 6, 2006 Αρχική απάντηση από trendy [Σήμερα, στις 04:34] j = rand() % (N+1);/*ari8mos sigoura mikroteros-isos N*/ if ( j < L ) Ci[i] = j + L;/*an mikroteros tou L...*/ else Ci[i] = j; Σε αντικατάσταση αυτού θα πρότεινα: Ci[i] = rand() % (U-L + 1) + L ... που νομίζω πως δίνει ακριβώς το ζητούμενο. Επίσης πριν το for(; θα μπορούσε να μπεί ένα srand() με όρισμα που να δίνεται από το χρήστη κάθε φορά (getch(), scanf() ). Έτσι θα μπορούμε να δίνουμε κάθε φορά διαφορετικό seed στη γεννήτρια τυχαίων αριθμών ώστε να έχουμε εντελώς διαφορετικές ακολουθίες τυχαίων αριθμών από την rand() σε κάθε εκτέλεση του προγράμματος. -Κ.
ARVAS Μάϊος 6, 2006 Author #32 Μάϊος 6, 2006 1)frap: δυστυχως αυτη την αντικατασταση που εκανες δεν μπορω να την χρησημοποιησω γιατι δεν εχουμε διδαχθει κατι παρομοιο "(% (U-L + 1) + L) αρα "δεν υπαρχει"..2)αυτο που ειπες για το srand θα ηθελα πολυ να το δω γιατι συμφωνα με τις οδηγιες μαλλον πρεπει να χρησημοποιηθει(αν θημαμαι καλα για αρχικοποιηση)Ευχαριστω..
gocu Μάϊος 6, 2006 #33 Μάϊος 6, 2006 ρε arvas παρακολουθω απο την αρχη αυτη τη συζητηση και δεν μπορω να καταλαβω τι σκ*τα σπουδαζειςσιγουρα εχει σχεση με προγραμματισμο η και να μην εχει σχεση γιατι δε βαζεις κατω το μυαλο σου να λυσεις εστω τα αλγοριθμικα προβληματα που συναντας?περιμενεις να σου διδαξουν να προσθαφαιρεις τα ορια ενος διαστηματος για να βρεις μια τιμη μεσα σε ενα διαστημα?? τι λες?αυτο που θα σε διδασκουν ,αλλα δε θα το εχεις παρει χαμπαρι,ειναι να σκεφτεσαι αλγοριθμικα και να προσπαθεις να μετατρεπεις αυτα που θες σε απλες λογικες σχεσεις...και εμενα μου ηταν δυκολος ο προγραμματισμος αλλα εσυ τα περιμενεις ολα ετοιμασυν αθηνα και χειρα κινει μεγαλερωτα κανα φιλαρακι σου συμφοιτητη να σου πει δυο πραγματα, δεν ειναι τιποτα σπουδαιο
ARVAS Μάϊος 6, 2006 Author #34 Μάϊος 6, 2006 1)Ξερω να σκεφτομαι "αλγοριθμικα" οπως λες και ειμαι σιγουρος για αυτο αλλα δεν εχω ιδεα πως χρησημοποιουνται 2 εντολες(rand srand) οποτε δεν μπορω να συνταξω τον απαιτουμενο αλγοριθμο..2)Δεν ειμαι απο τους ανθρωπους που τα περιμενει ολα ετοιμα.Αρχικα εβγαλα τα ματια μου πανω στο βιβλιο μηπως βρω λυση και μετα ρωτησα συμφοιτητες μου οι οποιοι η δεν μου εδωσαν καθολου απαντηση η οι απαντησεις ηταν πολυ συγκεχυμενες και αοριστες.δεν εβγαλα ακρη.3)Σπουδαζω φυσικος4)δεν ειναι αναγκη να εισαι τοσο επιθετικος.@frap:ενταξει η λουπα για τον ελεγχο εφτιαξα δικια μου αλλα αυτο το srand τι γινεται;;;
frap Μάϊος 6, 2006 #35 Μάϊος 6, 2006 Βάλ'την πριν τη "λούπα" ... έχεις καταλάβει τι κάνει η srand() ? Δες τι έγραψα παραπάνω...Επίσης πριν το for() θα μπορούσε να μπεί ένα srand() με όρισμα που να δίνεται από το χρήστη κάθε φορά (getch(), scanf() ). Έτσι θα μπορούμε να δίνουμε κάθε φορά διαφορετικό seed στη γεννήτρια τυχαίων αριθμών ώστε να έχουμε εντελώς διαφορετικές ακολουθίες τυχαίων αριθμών από την rand() σε κάθε εκτέλεση του προγράμματος.
gocu Μάϊος 6, 2006 #36 Μάϊος 6, 2006 ΔΕΝ ειμαι επιθετικοςυμαρτοναπλα μου θυμιζεις τον παλιο εαυτο μου...στο πρωτο εξαμηνο που εκανα οτι κανεις και εσυ...σιγουρα ειχες αλγοριθμικο προβλημα τουλαχιστον αυτο καταλαβα εγω απο την πρωτη σελιδα της συζητησης αυτης....δεν ειναι διαγωνισμος ποιος ειναι καλυτεροςμην το παιρνεις ετσι..., απλα ειναι κατι το οποιο στο εχουν πει με τουλαχιστον 2 τροπους εδω μεσα και δεν εννοεις να το σουλουπωσεις και να το φερεις στα μετρα σου(σε αυτο που θες δηλαδη για τελικο αποτελεσμα)
ARVAS Μάϊος 6, 2006 Author #37 Μάϊος 6, 2006 Θα σε απογοητευσω δυστυχως αλλα δεν καταλαβα τι κανει. Μπορεις να δωσεις αν δε σου κανει κοπο ενα συντομο παραδειγμα;;
frap Μάϊος 6, 2006 #38 Μάϊος 6, 2006 Αρχική απάντηση από ARVAS [Σήμερα, στις 18:51] 1)frap: δυστυχως αυτη την αντικατασταση που εκανες δεν μπορω να την χρησημοποιησω γιατι δεν εχουμε διδαχθει κατι παρομοιο "(% (U-L + 1) + L) αρα "δεν υπαρχει".. Δεν έχετε διδαχθεί τον τελεστή % (modulo - ακέραιο υπόλοιπο διαίρεσης);Την πρόσθεση ;Τη χρήση παρενθέσεων;Αν σε μπέρδεψαν τα U και L χρησιμοποίησα τις μεταβλητές του trendy στον κώδικα που έδωσε.Αν δεν κατάλαβες τι κάνω, η πράξη αναλυτικότερα είναι να:- να πάρουμε το αποτέλεσμα της rand() <- τυχαίος αριθμός.- να παρουμε το ακέραιο υπόλοιπο της διαιρέσης με τη διαφορά του ανω και κάτω ορίου συν 1- το παραπάνω αποτέλεσμα θα είναι ένας αριθμός από 0 έως και U-L (γι'αυτό βάλαμε συν 1 επάνω).- προσθέτουμε το παραπάνω στο κάτω όριο, έτσι τελικά ο αριθμός που προκύπτει θα είναι από L+0=L έως και L+(U -L)=U... που επειδή προέρχεται από την rand(), είναι και αυτός τυχαίος αλλά μέσα στα όρια που θέσαμε.
ARVAS Μάϊος 6, 2006 Author #39 Μάϊος 6, 2006 Το % εννοουσα αλλα ετσι οπως τα λες μαλλον θα μπορω να το χρησημοποιησω..Αυτο με την αρχικοποιηση για το srand δεν μπορω να καταλαβω αλλα αφου λογικα θα βγαινει και ετσι γιατι να χρησημοποιηθει;;edit: μαλλον θα εννοεις %->ακεραιο αποτελεσμα η υπολοιπο διαιρεσης γιατι ακεραιο υπολοιπο λιγο δυσκολο να εναι
frap Μάϊος 6, 2006 #40 Μάϊος 6, 2006 Αρχική απάντηση από ARVAS [Σήμερα, στις 21:26] Θα σε απογοητευσω δυστυχως αλλα δεν καταλαβα τι κανει. Μπορεις να δωσεις αν δε σου κανει κοπο ενα συντομο παραδειγμα;; οκ.κάνε το ακόλουθο πρόγραμμα:#include <stdio.h>#include <stdlib.h>int main() {int i,j;srand(10);for ( i = 0 ; i < 10; i++ ) { j = rand(); printf ("%d \n",j); }}Compile και run. 10 τυχαίοι αριθμοί. Τέλεια.Run ξανά. 10 τυχαίοι αριθμοί πάλι... αλλά οι ίδιοι με τους προηγούμενους μήπως???Μα καλά, τι στο καλό τυχαίοι είναι τότε; Κάθε φορά οι ίδιοι;’λλαξε το srand(10) σε srand(11). Compile & run ... παρατηρείς κάτι;’λλαξε το srand(11) σε srand(12). Compile & run ... παρατηρείς κάτι;’λλαξε το srand(12) σε srand(10). Compile & run ... παρατηρείς κάτι;Συμπέρασμα: η rand() είναι γεννήτρια τυχαίων αριθμών. Η γεννήτρια αρχικοποιήται με την srand. Για την ίδια αρχικοποίηση, η rand() δίνει ΑΚΡΙΒΩΣ την ίδια ακολουθία αριθμών. Οι αριθμοί είναι "τυχαίοι" μεταξύ τους. Αλλά δεν είναι καθόλου τυχαίοι σε κάθε διαδοχική εκτέλεση του προγράμματος. Εάν θα θέλαμε σε κάθε εκτέλεση διαφορετική ακολουθία, πρέπει να φροντίσουμε ώστε να καλούμε την srand() μια φορά στην αρχή του προγράμματός μας με όρισμα που θα καθορίζεται από κάποιο εξωτερικό παράγοντα... το δευτερόλεπτο της ώρας σε εκατοστά πχ. .. η κάποιο πλήκτρο που θα πατήσει ο χρήστης.Υπάρχουν πολλές περιπτώσεις που εκμεταλλευόμαστε την δυνατότητα να τρέχουμε το πρόγραμμά μας με την ίδια αρχικοποίηση στις γεννήτριες τυχαίων αριθμών. Για παράδειγμα σε κάποιο πρόγραμμα προσομοίωσης που γίνεται χρήση τυχαίων αριθμών (πααααάρα πολύ συνηθισμένο), προκειμένου να βελτιστοποιήσουμε τον κώδικα, τρέχουμε την βελτιστοποιημένη έκδοση με ίδιο seed για τη γεννήτρια και συγκρίνουμε τα αποτελέσματα με αυτά του αρχικού κώδικα (που φυσικά θεωρούμε ότι είναι bug-free).-Κ.
Recommended Posts
Archived
This topic is now archived and is closed to further replies.