User Tools

Site Tools


qna:c:lib:stdlib:seed-time

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
qna:c:lib:stdlib:seed-time [2021/03/12 10:01]
xallos created
qna:c:lib:stdlib:seed-time [2021/03/12 10:19] (current)
xallos
Line 3: Line 3:
 Ο σκοπός της ''**srand**'' είναι να παρέχει έναν αρχικό σπόρο (seed) στο σύστημα παραγωγής ψευδοτυχαίων αριθμών. Δέχεται μία παράμετρο (που είναι unsigned int) την οποία χρησιμοποιεί για να __καθορίσει την ακολουθία των ψευδοτυχαίων αριθμών__ που παράγονται από τις κλήσεις της ''**rand**'' από εκείνη τη στιγμή και μετά. Ο σκοπός της ''**srand**'' είναι να παρέχει έναν αρχικό σπόρο (seed) στο σύστημα παραγωγής ψευδοτυχαίων αριθμών. Δέχεται μία παράμετρο (που είναι unsigned int) την οποία χρησιμοποιεί για να __καθορίσει την ακολουθία των ψευδοτυχαίων αριθμών__ που παράγονται από τις κλήσεις της ''**rand**'' από εκείνη τη στιγμή και μετά.
  
-Δηλαδή για μία οποιαδήποτε δεδομένη τιμή του σπόρου, τα αποτελέσματα που δίνουν διαδοχικές κλήσεις στη συνάρτηση ''**rand**'' (ενώ διαφέρουν από τη μία κλήση στην άλλη), κάθε φορά __η ακολουθία των αποτελεσμάτων τους θα είναι πάντα η ίδια__. Έτσι κάθε φορά που θα εκτελείται ο κώδικας, θα προκύπτουν τα ίδια αποτελέσματα.+Δηλαδή για μία οποιαδήποτε δεδομένη τιμή του σπόρου, __**η ακολουθία** των αποτελεσμάτων που δίνουν διαδοχικές κλήσεις στη συνάρτηση ''**rand**'' (ενώ διαφέρουν από τη μία κλήση στην άλλη), **θα είναι πάντα η ίδια**__. Έτσι κάθε φορά που θα εκτελείται ο κώδικας, θα προκύπτουν τα ίδια αποτελέσματα.
  
-Αυτό φυσικά δεν ταιριάζει με τον σκοπό να φαίνονται τα αποτελέσματα όσο πιο τυχαία γίνεται. Έτσι θα πρέπει να δωθεί ως παράμετρος στην ''**srand**'' ένας αριθμός που είναι διαφορετικός κάθε φορά που εκτελείται το πρόγραμμά μας.+Αυτό φυσικά δεν ταιριάζει με τον σκοπό να είναι τα αποτελέσματα όσο πιο τυχαία γίνεται. Έτσι θα πρέπει να δωθεί ως παράμετρος στην ''**srand**'' ένας αριθμός που είναι διαφορετικός κάθε φορά που εκτελείται το πρόγραμμά μας.
  
-Ένας καλός υποψήφιος για αυτή τη δουλειά είναι η χρονική στιγμή κατά την οποία ξεκινά η εκτέλεση του προγράμματος. Έτσι θα χρησιμοποιήσουμε τη συνάρτηση ''**time(NULL)**'' ( ή ''**time(0)**''), η οποία επιστρέφει τον αριθμό των δευτερολέπτων που έχουν περάσει μέχρι τη στιγμή που καλείται, μετρώντας από την 1/1/1970. Άρα σε κάθε εκτέλεση είναι διαφορετική η τιμή αυτή.+Ένας καλός υποψήφιος για αυτή τη δουλειά είναι η χρονική στιγμή κατά την οποία ξεκινά η εκτέλεση του προγράμματος. Έτσι θα χρησιμοποιήσουμε τη συνάρτηση ''**time(NULL)**'' ( ή ''**time(0)**'' ), η οποία επιστρέφει τον αριθμό των δευτερολέπτων που έχουν περάσει μέχρι τη στιγμή που καλείται, μετρώντας από την 1/1/1970. Άρα σε κάθε εκτέλεση είναι διαφορετική η τιμή αυτή. Μπορείτε να δείτε περισσότερα στη σελίδα:\\ 
 +[[https://www.tutorialspoint.com/c_standard_library/c_function_time.htm]]
  
 Άρα καλή πρακτική είναι στην αρχή κάθε προγράμματος που θα χρησιμοποιήσει την ''**rand**'' να μπαίνει ο παρακάτω κώδικας που ορίζει το seed (τον σπόρο). Άρα καλή πρακτική είναι στην αρχή κάθε προγράμματος που θα χρησιμοποιήσει την ''**rand**'' να μπαίνει ο παρακάτω κώδικας που ορίζει το seed (τον σπόρο).
Line 17: Line 18:
 ''**srand( time( 0 ) );**'' ''**srand( time( 0 ) );**''
  
-Για να χρησιμοποιήσετε την ''**time**'' θα πρέπει να κάνετε ''**__#include <time.h>__**'' ενώ εάν έχετε χρησιμοποιήσει τη γραφή με το ''**NULL**'', ίσως χρειαστεί να κάνετε και ''**__#include <stdlib.h>__**''.+<WRAP info>Για να χρησιμοποιήσετε την ''**time**'' θα πρέπει να κάνετε ''**__#include <time.h>__**'' ενώ εάν έχετε χρησιμοποιήσει τη γραφή με το ''**NULL**'', ίσως χρειαστεί να κάνετε και ''**__#include <stdlib.h>__**''.</WRAP>
  
 <WRAP important>**ΠΡΟΣΟΧΗ!** Η ''**srand**'' θα πρέπει να καλείται __μία φορά πριν την πρώτη χρήση της ''**rand**''__ στην αρχή του κώδικα - καλύτερα να είναι μία από τις πρώτες εντολές της ''**main**'' - και όχι κάθε φορά που χρησιμοποιείται η ''**rand**''. Δείτε και αυτό το σχετικό άρθρο:\\ <WRAP important>**ΠΡΟΣΟΧΗ!** Η ''**srand**'' θα πρέπει να καλείται __μία φορά πριν την πρώτη χρήση της ''**rand**''__ στην αρχή του κώδικα - καλύτερα να είναι μία από τις πρώτες εντολές της ''**main**'' - και όχι κάθε φορά που χρησιμοποιείται η ''**rand**''. Δείτε και αυτό το σχετικό άρθρο:\\
 [[https://stackoverflow.com/questions/7343833/srand-why-call-it-only-once]]</WRAP> [[https://stackoverflow.com/questions/7343833/srand-why-call-it-only-once]]</WRAP>
qna/c/lib/stdlib/seed-time.1615543271.txt.gz · Last modified: 2021/03/12 10:01 by xallos