tsialiam Δημοσ. 30 Νοεμβρίου 2006 Δημοσ. 30 Νοεμβρίου 2006 Thelw ena programma pou na paragei tuxaious arithmous apo to 0 ews to 10 se C. Xrisimopoiw r=drand48()*10 ; to problhma einai oti oses fores kai na treksw to programma tha erthoun oi idioi pseudotuxaioi arithmoi me thn idia seira. Kamia idea?
parsifal Δημοσ. 30 Νοεμβρίου 2006 Δημοσ. 30 Νοεμβρίου 2006 Πρέπει να δώσεις μία διαφορετική αρχική τιμή στο "φύτρο" (seed) που είναι η βάση για τη σειρά των αριθμών που θα παραχθούν. Συνήθως χρησιμοποιείται γι'αυτόν το λόγο το ρολόι του συστήματος: #include <stdlib.h>srand(time(NULL)); Υπ'όψιν ότι όταν θες να κάνεις debugging, καλό είναι να βάζεις σε σχόλιο την srand, ώστε να έχεις και πάλι προβλέψιμη σειρά στους ψευδοτυχαίους που παράγονται...
chiossif Δημοσ. 1 Δεκεμβρίου 2006 Δημοσ. 1 Δεκεμβρίου 2006 Με την ευκαιρία θυμίζω - αντιγράφω από το "The C programming Language" των Brian W. Kernighan και Dennis M. Ritchie τον σχετικό κώδικα: > unsigned long int next = 1; /* rand: return pseudo-random integer on 0..32767 */ int rand(void) { next = next * 1103515245 + 12345; return (unsigned int)(next/65536) % 32768; } /* srand: set seed for rand() */ void srand(unsigned int seed) { next = seed; } Πριν βιαστείτε να το ξαναϋλοποιήσετε ή για περισσότερα: - Αναρωτηθείτε, τι είναι άραγε ο 1103515245; Πιστεύω ότι η απάντηση ΔΕΝ είναι αυτή: [ http://www.thescripts.com/forum/thread223451.html ] - Μελετήστε προσεκτικά τις ιστοσελίδες: [ http://members.cox.net/srice1/random/ ], [ http://random.mat.sbg.ac.at/ ] και μην ξεχάσετε το 7ο κεφάλαιο του [ http://www.nrbook.com/a/bookcpdf.html ] - Αν είστε πράγματι άυπνοι "συνδέστε" το θέμα με την κρυπτογραφία...
stathis85tpt Δημοσ. 1 Δεκεμβρίου 2006 Δημοσ. 1 Δεκεμβρίου 2006 Φιλε tsialiam ειχα κ εγω το ιδιο θεμα με ενα φιλαρακι μου στη προσπαθεια μας να κανουμε ενα προγραμμα προσωμιωσης του κινο... το γνωστο παιχνιδι του οπαπ! μετα απο κοπους το καταφεραμε... κ βγαζει καθε φορα διαφορετικους αριθμους.... απο το 1-80 ομως.. θες να το κανω ποστ εδω? δε ξερω αν ειναι πρεπον για εμας τους δημιουργους αλλα κ για καποιους που ισως επωφεληθουν του προγραμματος.... τελος παντων ελπιζω να μην παρεξηγηθω.... αλλα ειμαι της αποψης οτι "τα αγαθα κοποις κτωντε".... ο νωον νοειτω==> ή οπως αλλιως γραφεται τελος παντων... μας επιασε η φιλοσοφια κ ειναι κ περασμενη η ωρα...
Directx Δημοσ. 1 Δεκεμβρίου 2006 Δημοσ. 1 Δεκεμβρίου 2006 Η παρακάτω ρουτίνα (Borland C/C++ Builder 6) υποδεικνύει έναν τρόπο να υπολογίσει κανείς ψευδό-τυχαίες τιμές εντός επιθυμητών ορίων. > int _RandRange(int nMin,int nMax) { int nRandNumber; do{ nRandNumber = rand()%(nMax+1); }while(nRandNumber<nMin || nRandNumber>nMax); return nRandNumber; } Η ρουτίνα προϋποθέτει πως έχετε ορίσει το seed της rand (srand), σε περίπτωση που προγραμματίζετε σε περιβάλλον Windows αντί της time(NULL) μπορείτε να προτιμήσετε την GetTickCount. Φυσικά μπορεί να υπάρχουν bugs. Υ.Γ. Αρκετοί compilers όπως η (τέως) Borland (νυν CodeGear) C/C++ προσφέρουν την έτοιμη (non ANSI από όσο γνωρίζω) ρουτίνα randomize() η οποία ουσιαστικά πρόκειται για ένα srand(time(NULL)) ενώ ομοίως παρέχουν την random(N) η οποία επιστρέφει αριθμούς μεταξύ του μηδέν ως N-1, λειτουργώντας δηλαδή όπως η εντολή rand()%N. Για περισσότερα σχετικά με τις rand & srand ενδεχομένως αξίζει να κάνετε μια αναζήτηση σε παλαιότερα θέματα του παρόντος forum.
dop Δημοσ. 1 Δεκεμβρίου 2006 Δημοσ. 1 Δεκεμβρίου 2006 Για τυχαίους αριθμούς κοιτάξε τα παρακάτω στο http://c-faq.com : Ερώτηση 13.15 (I need a random number generator.) Ερώτηση 13.16 (How can I get random integers in a certain range?) Οι τυχαίοι αριθμοί αγγίζουν τα όρια της μαύρης μαγείας στους υπολογιστές. Υπάρχουν κάποιες καλές μηχανές για τυχαίους αριθμούς και κάποιες όχι τόσο καλές. Το θέμα είναι ότι ενώ στην εκάστοτε περίπτωση θέλουμε πλήρη τυχαιότητα, θέλουμε επιπλέον να έχουμε και απόλυτα ίδιες και επαναλήψιμες ψευδοτυχαίες ακολουθίες όποτε τις χρειαζόμαστε (κυρίως για testing). Τα high-order bits είναι συνήθως πιο τυχαία από τα low order, για αυτό και η rand()%N δεν είναι και πολύ καλή ιδέα - είναι βολικό και θελκτικό (επιπλέον δεν κοστίζει και πολύ), αλλά δεν παράγει καλές ακολουθίες. Αν γράφει κάποιος σε C++ ας κάνει τον κόπο να κοιτάξει και την βιβλιοθήκη boost.random (http://www.boost.org).
takistmr Δημοσ. 3 Δεκεμβρίου 2006 Δημοσ. 3 Δεκεμβρίου 2006 Πρέπει να θέσεις μία μεταβλητη αναφοράς για να σου παράγει "πιο τυχαίους" αριθμούς. Συνήθως χρησιμοποιείται η timer γιατί για να πετύχει τον ίδιο αριθμό του timer σε 2 διαδοχικές εκτελέσεις της η Random θα πρέπει να είσαι πάραπάραπάραπάραπάραπάραπάραπάραπάραπάραπάρα..... πολύ κολόφαρ....
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.