christian-ago Δημοσ. 14 Ιουλίου 2012 Δημοσ. 14 Ιουλίου 2012 (επεξεργασμένο) Εχω το παρακατω προγραμμα που παραγει τυχαιες συμβολοσειρες ορισμενου μηκους μεσα απο μια Arraylist. Το προβλημα ειναι οτι θελω οταν παραγει η γεννητρια τυχαιων αριθμων ενα τυχαιο γραμμα απο την Arraylist (το οποιο το βαζει σε μια αλλη Arraylist για να σχηματιστει η λεξη) να βαζει null στο στοιχειο που επελεξε για να μη το ξαναδιαλεξει. Αμα τρεξτε το προγραμμα θα δειτε οτι πολυ λιγες σχηματισμενες συμβολοσειρες δεν περιεχουν καθολου null στοιχεια, ενω οι περισσοτερες εχουν ενα ή δυο. Το ζητουμενο ειναι να μην εχουν κανενα. Μαλλον το προβλημα ειναι στον ελεγχο if (words.get(k) != null) - δεν κανει σωστα τη δουλεια του. Ειμαι νεος στη Java οποτε δεχομαι και παρατηρησεις... >package javaapplication8; import java.util.ArrayList; import java.util.Random; public class JavaApplication8 { public static void main(String[] args) { Random randomGenerator = new Random(); for (int h = 0; h < 100; h++){ ArrayList<String> words = new ArrayList(); words.add("a"); words.add("b"); words.add("c"); words.add("d"); words.add("e"); words.add("f"); words.add("e"); words.add("g"); words.add("h"); words.add("i"); words.add("j"); words.add("k"); words.add("l"); words.add("m"); words.add("n"); words.add("o"); words.add("p"); words.add("q"); words.add("r"); words.add("s"); ArrayList<String> joker = new ArrayList(); for (int i = 0; i < 10; i++){ ArrayList<Integer> take = new ArrayList(); for (int k = 0; k < words.size(); k++){ if (take.size() == 10) break; if (words.get(k) != null) take.add(k); } int s = randomGenerator.nextInt(take.size()); joker.add(words.get(s)); words.set(s, null); if (joker.size() == 5) { System.out.println(joker); break; } } } } } Επεξ/σία 14 Ιουλίου 2012 από christian-ago
nilosgr Δημοσ. 14 Ιουλίου 2012 Δημοσ. 14 Ιουλίου 2012 Γιατι κανεις set() και δεν χρησημοποιεις τη remove() ?
christian-ago Δημοσ. 14 Ιουλίου 2012 Μέλος Δημοσ. 14 Ιουλίου 2012 Γιατι η remove αφου διαγραψει το στοιχειο, μεταφερει ολα τα υπολοιπα στοιχεια μια θεση αριστερα. Θελω να διαγραψω το στοιχειο, αλλα επισης θελω και η θεση τους στη λιστα να ειναι σταθερη, να μη μετατιθενται τα στοιχεια. Εφοσον αυτο δεν μπορει να γινει με καποια function αναγκαστικα εχω ξεμεινει με το null.
nilosgr Δημοσ. 14 Ιουλίου 2012 Δημοσ. 14 Ιουλίου 2012 Λοιπόν, η word έχει τις λέξεις οι οποίες θα ενωθούν με τυχαίο τρόπο, σωστά; Η joker έχει το αποτέλεσμα που θα παραχθεί; Η take όμως που εξυπηρετεί;
christian-ago Δημοσ. 14 Ιουλίου 2012 Μέλος Δημοσ. 14 Ιουλίου 2012 Αμα βαλεις το System.out.println(take); στο τελος του βροχου for (int k=0)... θα δεις οτι δινω καθε φορα στη γεννητρια να επιλεξει αναμεσα σε 10 στοιχεια της λιστας και οχι σε ολα. Αυτο το κανω γιατι εξυπηρετει το προγραμμα που φτιαχνω. Η take φαινεται οτι παιρνει και null στοιχεια, και αυτα τα δινει λανθασμενα τα δινει στη γεννητρια που παραγει τωρα και στοιχεια που εχουν ηδη επιλεχθει. EDIT: Η word περιεχει τα γραμματα που αποθηκευονται στη joker με αποτελεσμα να δημιουργηθει μια συμβολοσειρα στην τελευταια. H joker ειναι μεταβλητου μηκους. H word εχει σταθερο μηκος. Δεν ξερω αλλα μαλλον το προβλημα ειναι σε αυτη την εντολη: int s = randomGenerator.nextInt(take.size()); Διαλεγει τυχαιους αριθμους αναμεσα στους δεικτες στο ευρος της λιστας (δηλ. απο 1 μεχρι 10) και οχι αναμεσα στα στοιχεια της λιστας. Οκ το βρηκα, τελικα αφορουσε την τελευταια παρατηρηση που εκανα. Η λυση ειναι: >Collections.shuffle(take); int s = take.get(0); Ετσι παιρνω ενα τυχαιο στοιχειο και οχι δεικτη απο τη λιστα. Ευχαριστω για τη βοηθεια.
Directx Δημοσ. 14 Ιουλίου 2012 Δημοσ. 14 Ιουλίου 2012 Ίσως (εξαρτάται από τις ανάγκες σου) θα μπορούσε να γίνει και ως εξής: > ArrayList<Character> ChrArr = new ArrayList<Character>(); for(Character Chr = 'a'; Chr <= 's'; Chr++) ChrArr.add(Chr); Collections.shuffle(ChrArr); StringBuilder strJoker = new StringBuilder(10); for(int ChrIdx = 0; ChrIdx < 10; ChrIdx++) strJoker.append(ChrArr.get(ChrIdx)); System.out.println(strJoker.toString()); (Δηλαδή κάνεις shuffle τα γράμματα του ChrArr και ύστερα περνάς τα 10 πρώτα από αυτά στο strJoker οπότε έχεις ένα "τυχαίο" αλφαριθμητικό) (--UPDATE: Μικροδιορθώσεις)
christian-ago Δημοσ. 14 Ιουλίου 2012 Μέλος Δημοσ. 14 Ιουλίου 2012 Πιο γρηγορο, αποτελεσματικο ποιο νομιζεις οτι ειναι; Παντως δεν ξερω αν δουλευει ο τροπος σου στη δικη μου περιπτωση γιατι ενδεικτικα εδωσα ταξινομημενη τη λιστα με τα γραμματα. Αν εχω λιστα σε τυχαια σειρα γραμματων τι γινεται;
Directx Δημοσ. 14 Ιουλίου 2012 Δημοσ. 14 Ιουλίου 2012 Πιο γρηγορο, αποτελεσματικο ποιο νομιζεις οτι ειναι; Παντως δεν ξερω αν δουλευει ο τροπος σου στη δικη μου περιπτωση γιατι ενδεικτικα εδωσα ταξινομημενη τη λιστα με τα γραμματα. Αν εχω λιστα σε τυχαια σειρα γραμματων τι γινεται; Κοίταξε αν το θέμα είναι να πάρεις ένα τυχαίο αλφαριθμητικό από μια λίστα με n γράμματα, με την προϋπόθεση ότι κάθε ένα εξ' αυτών θα πρέπει να χρησιμοποιηθεί άπαξ, τότε αρκεί να ανακατέψεις την σειρά των γραμμάτων που περιέχει η λίστα και ύστερα να διαβάσεις από την αρχή της λίστας ως το μέγεθος του αλφαριθμητικού που επιθυμείς να παράγεις τα όποια γράμματα βρίσκονται στις θέσεις αυτές. Η αρχική ταξινόμηση της λίστας, από την στιγμή που θα την ανακατέψεις πριν την χρησιμοποιήσεις (μέσο shuffle) δεν έχει καμία πρακτική σημασία διότι έχει ήδη τροποποιηθεί.
christian-ago Δημοσ. 14 Ιουλίου 2012 Μέλος Δημοσ. 14 Ιουλίου 2012 Η ταξινομηση δεν εχει καμια σχεση με το προγραμμα. Εγω απλα εδειξα τα στοιχεια της λιστας ταξινομημενα. Το τελικο προγραμμα θα εχει μια λιστα στην οποια η μονη τροποποιηση που θα γινεται ειναι να τιθεται τα στοιχεια null, που επιλεγονται "τυχαια" συμφωνα με τον παραπανω αλγοριθμο. Μπορω μεσω της shuffle να παραγω τυχαιους μοναδικους αριθμους πχ. 5; Και κατι αλλο γιατι γραφεις: Collections.shuffle(ChrArr, new Random()); To παρακατω δεν αρκει; >Collections.shuffle(take);int s = take.get(0);
Directx Δημοσ. 14 Ιουλίου 2012 Δημοσ. 14 Ιουλίου 2012 Μπορω μεσω της shuffle να παραγω τυχαιους μοναδικους αριθμους πχ. 5; Η shuffle αναδιατάσσει με τυχαία σειρά το περιεχόμενο μιας λίστας. Για την παραγωγή τυχαίων αριθμών ρίξε μια ματιά στην Random class και στις συναρτήσεις της, .nextInt(), .nextLong() κλπ. Και κατι αλλο γιατι γραφεις: Collections.shuffle(ChrArr, new Random()); To παρακατω δεν αρκει; >Collections.shuffle(take);int s = take.get(0); Αρκεί, απλά εκ παραδρομής λόγο συνήθειας από την srand των C/C++.
christian-ago Δημοσ. 14 Ιουλίου 2012 Μέλος Δημοσ. 14 Ιουλίου 2012 Μπορω μεσω της shuffle να παραγω τυχαιους μοναδικους αριθμους πχ. 5; Η shuffle αναδιατάσσει με τυχαία σειρά το περιεχόμενο μιας λίστας. Για την παραγωγή τυχαίων αριθμών ρίξε μια ματιά στην Random class και στις συναρτήσεις της, .nextInt(), .nextLong() κλπ. Εννοουσα μεσω του αλγοριθμου να παραγω τυχαια στοιχεια, οχι αμεσα απο τη shuffle. Παντως ευχαριστω, topic solved!
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα