acid18 Δημοσ. 23 Μαΐου 2012 Δημοσ. 23 Μαΐου 2012 Στη c/c++ πως μπορώ κάθε φορά με την rand να δημιουργώ διαφορετικούς τυχαίους, δηλαδή σε ένα range ας πούμε 1-10 αν βγει το 5 μια φορά να μη ξαναβγεί? ποια είναι η λογική?
migf1 Δημοσ. 23 Μαΐου 2012 Δημοσ. 23 Μαΐου 2012 Γράφεις κάπου στην αρχή της main() ... >srand( time(NULL) ); και ... > #include <stdlib.h> #include <time.h> στην αρχή του προγράμματος. Το να κρατάς μονάχα μια εμφάνιση του κάθε νούμερου θα πρέπει να το εξασφαλίσεις εσύ κατόπιν, προγραμματιστικά.
παπι Δημοσ. 23 Μαΐου 2012 Δημοσ. 23 Μαΐου 2012 >#include <algorithm> int main(int argc, char *argv[]) { int arr[] = { 1,2,3,4,5}; std::random_shuffle(arr, arr + _countof(arr)); return 0; }
acid18 Δημοσ. 24 Μαΐου 2012 Μέλος Δημοσ. 24 Μαΐου 2012 Τελικά το έκανα με έναν static πίνακα που κρατάω τους αριθμούς που βγήκαν τους συγκρίνω και βγάζω το τελικό..
defacer Δημοσ. 24 Μαΐου 2012 Δημοσ. 24 Μαΐου 2012 Τελικά το έκανα με έναν static πίνακα που κρατάω τους αριθμούς που βγήκαν τους συγκρίνω και βγάζω το τελικό.. Αυτό το ερώτημα που έχεις είναι σούπερ κλασικό και πολύ δυσκολότερο να απαντηθεί σωστά απ' ο,τι φαίνεται εκ πρώτης όψεως. Πρώτα απ' όλα, "τυχαία" και "μη επαναλαμβανόμενα" στην ίδια πρόταση δεν έχει νόημα. Καταλαβαίνω βέβαια τι θέλεις να πεις, αλλά α) δεν υπάρχει πρακτικός τρόπος να δημιουργήσεις μια απείρου μήκους ακολουθία τυχαίων αριθμών που δεν επαναλαμβάνονται και β) δεν υπάρχει και περίπτωση να χρειάζεται να κάνεις κάτι τέτοιο. Πολύ πιθανότερο είναι να θέλεις να δημιουργήσεις μια τυχαία μετάθεση ενός συνόλου προκαθορισμένων αριθμών (π.χ. 1-10 που ανέφερες και συ). Στην περίπτωση αυτή η λύση είναι μία, η εξής: Δημιουργείς μια ακολουθία από τους αριθμούς που σε ενδιαφέρουν (π.χ. int num[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; Fischer-Yates shuffle στην ακολουθία (μη δοκιμάσεις να γράψεις τον αλγόριθμο μόνος σου, θα κάνεις λάθος -- ορίστε έτοιμος κώδικας) Διαβάζεις τους αριθμούς που έχουν ανακατευτεί με τη σειρά, που τώρα πια είναι τυχαία
migf1 Δημοσ. 24 Μαΐου 2012 Δημοσ. 24 Μαΐου 2012 Τελικά το έκανα με έναν static πίνακα που κρατάω τους αριθμούς που βγήκαν τους συγκρίνω και βγάζω το τελικό.. Οι λύσεις που πρότειναν τα παιδιά παραπάνω είναι πολύ πιο compact και κυρίως πολύ πιο efficient. Αν δεν σε ενδιαφέρει η κατανομή των ψευδοτυχαίων δεν είναι καθόλου δύσκολο να φτιάξεις μια δικιά σου shuffle() συνάρτηση σε C. Εδώ: http://codegolf.stac...com/a/3314/2265 είχα γράψει παλιότερα golfed κώδικα που ανακατεύει τα ενδιάμεσα γράμματα μιας οποιασδήποτε λέξης, κρατώντας σταθερά το 1ο και το τελευταίο. Εσύ δεν χρειάζεσαι καν αυτόν τον περιορισμό (από κάτω τον δείχνω και ungolfed). Εφόσον όμως χρησιμοποιείς C++ έχεις έτοιμη συνάρτηση shuffle() όπως δείχνει κι ο κώδικας του παπι παραπάνω.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα