tazos87 Δημοσ. 20 Μαΐου 2014 Δημοσ. 20 Μαΐου 2014 Θέλω να φτιάξω μια γεννήτρια τυχαίων αριθμών από το 1-45.Τώρα μόλις έκανα την εισαγωγή στη κλάση Random. Απλά μερικές φορές μου εμφανίζει διπλό κάποιον αριθμό...αλλά μου φαίνεται λογικά γραμμένος ο κώδικας! Δεν θα έπρεπε εφόσον ο αριθμός επαναλαμβάνεται να προσπερνούσε τη print? package luck; import java.util.*; public class Luck { public static void main(String[] args) { Random gen = new Random(); int num; int newNum = 0; for (int count = 1; count <= 5; count++){ num = 1+ gen.nextInt(45); // Διαλέγει αριθμό if (num != newNum) // Βρόχος για να μην επαναληφθεί ο ίδιος αριθμός System.out.print(num + " "); else count--; num = newNum; // Εξισώνω τον αριθμό που δοθηκε με το newNum } } }
παπι Δημοσ. 20 Μαΐου 2014 Δημοσ. 20 Μαΐου 2014 Θα παρεις εναν γκουβα , θα βαλεις μεσα στο γκουβα τους αριθμους απο 1 εως 45, θα τον κουνησεις και μετα θα παρεις τους πρωτους 5 αριθμους. Οπως το τζοκερ ενα πραμα. 3
defacer Δημοσ. 20 Μαΐου 2014 Δημοσ. 20 Μαΐου 2014 Αυτό που κάνεις απλά θα σε προστάτευε από το να πάρεις τον ίδιο αριθμό δύο φορές στη σειρά, όχι γενικά. Η καλύτερη μέθοδος για να πετύχεις το συγκεκριμένο αποτέλεσμα είναι το reservoir sampling, αλλά και με τη μέθοδο που λέει το παπί θα δουλέψει μια χαρά. Αυτό που πας κάνεις εδώ (έλεγχος των προηγούμενων επιλογών) είναι χειρότερο.
tazos87 Δημοσ. 20 Μαΐου 2014 Μέλος Δημοσ. 20 Μαΐου 2014 Ευχαριστω! Πωω defacer, ναι...πως κόλλησα έτσι! (αφού είναι μόνο για το επόμενο) Παπί καλό φαίνεται αυτό,απλά δεν τα έχω δει ακόμα δεν τα έχω μάθει ... αν έχετε υπόψιν κάποια άλλη πηγή να διαβάσω για πρώτη φορά,πείτε
Timonkaipumpa Δημοσ. 20 Μαΐου 2014 Δημοσ. 20 Μαΐου 2014 Αντί να σπας το κεφάλι σου, μπορείς απλά να βάλεις σε μία γυάλα 45 αριθμούς, να τους τραβήξεις τυχαία και να καταγράψεις τα αποτελέσματα. Αυτά θα είναι και αυτά που θα επιστρέφει η συνάρτησή σου. Π.χ. 1
defacer Δημοσ. 20 Μαΐου 2014 Δημοσ. 20 Μαΐου 2014 Παπί καλό φαίνεται αυτό,απλά δεν τα έχω δει ακόμα δεν τα έχω μάθει ... αν έχετε υπόψιν κάποια άλλη πηγή να διαβάσω για πρώτη φορά,πείτε Και μεις την πρώτη φορά που τα είδαμε δεν τα είχαμε μάθει απο πιο πριν... 1
parlapipator Δημοσ. 20 Μαΐου 2014 Δημοσ. 20 Μαΐου 2014 Καταρχήν αυτό που έχεις γράψει δεν ελέγχει αν έχει ξαναεπιλεγεί ένας αριθμός αλλά αν στο τρέχον loop επιλέχθηκε ίδιος με του προηγούμενου loop. Για να πετύχεις αυτό που θες πρέπει να βάζεις τα αποτελέσματα σε έναν πίνακα και να τον ελέγχεις σε κάθε loop. Επίσης δεν δίνεις τιμή πουθενά στο newNum και η τελευταία γραμμή δεν είναι μάλλον αυτό που ήθελες.
tazos87 Δημοσ. 20 Μαΐου 2014 Μέλος Δημοσ. 20 Μαΐου 2014 Οκ, βρήκα έναν τρόπο,θα κοιτάξω και με άλλον,αλλά εξηγείστε μου κάτι αν γίνεται. public static void main(String[] args) { Random ran = new Random(); ArrayList<Integer> al = new ArrayList<Integer>(); for(int i = 1; i <= 45; i++) al.add(i); for(int i = 0; i < 5; i++) { int x = al.remove(ran.nextInt(al.size()) ); System.out.print(" " + x); } System.out.println(); } Στο int x = al.remove(ran.nextInt(al.size()) ); καταλαβαίνω γιατι κάνουμε remove, το ran.nextInt για τον τυχαίο αριθμό, ΑΛΛΑ γιατί διαλέγει το size?? Δεν υποτίθεται οτι το μέγεθος δείχνει πόσους αριθμούς έχει η λίστα? (45) Κάποιος αν μπορεί για να μπορέσω να προχωρήσω...Ευχαριστώ!
defacer Δημοσ. 20 Μαΐου 2014 Δημοσ. 20 Μαΐου 2014 Δεν υποτίθεται οτι το μέγεθος δείχνει πόσους αριθμούς έχει η λίστα? (45) Κάποιος αν μπορεί για να μπορέσω να προχωρήσω...Ευχαριστώ! Θα μπορούσες πολύ απλά να κάνεις debug το πρόγραμμά σου και να δεις ότι σε κάθε επανάληψη το size μειώνεται και δεν παραμένει 45. Μετά από αυτό τα υπόλοιπα θα ήταν προφανή. 1
Dark_Sage Δημοσ. 20 Μαΐου 2014 Δημοσ. 20 Μαΐου 2014 (επεξεργασμένο) φίλε επειδή δεν ζήτησες την λύση αλλά το πάλεψες μόνος σου εγώ σου παραθέτω πιο κάτω μια λύση (αν δεν θέλεις άλλο να ταλαιπωρείσαι). Χρησιμοποίησα ενα hashmap για να εξασφαλισω την μοναδικότητα της εμφανίσης των 45 αριθμών. Ισως να δεις λιγο wikipedia java hashmap να δεις τι παιζει με key-values αν δεν ξέρεις. Είναι λιγο brute force λύση επειδή κάνω generate αριθμούς μέχρι να μην πάρχει ο ίδιος μεσα στο Hashmap αλλά για 45 αριθμούς είναι αμελητέο απο θέμα επίδοσης. θα χρειαστείς αυτά τα 2 imports στον κώδικα σου import java.util.HashMap; import java.util.Random; public static void main(String[] args) { //metabliti pou krataw ton tyxaio arithmo kathe fora int temp; //random generator Random rand = new Random(); //arxikopoiw ena HashMap pou tha kanei key-value pairs me int-int HashMap<Integer, Integer> hm = new HashMap<Integer, Integer>(); //o pinakas mou me 20 stoixeia int[] myArray = new int[20]; for (int i = 0; i < myArray.length; i++) { //kanw generate ena tuxaio arithmo apo to 1 ews to 45 temp = rand.nextInt(45) + 1; /* * koitaw an to hashmap mou exei ws value auto ton arithmo pou ekana * generate prin * an nai tote kanw generate enan allon kai pali tsekarw mexri na min * uparxei idios sto idi uparxwn set apo values tou hashmap */ while (hm.containsValue(temp)) { temp = rand.nextInt(45) + 1; } /* * me to parapanw bima exsafalisa oti den exw random * duplicates mesa sto hashmap mou * kai ton apothikeuw sto hashmap gia mellontiko tsekarisma */ hm.put(i, temp); //telos ton apoithikeuw mesa sto array mou myArray[i] = temp; } //emfanisi stoixeiwn for (int i = 0; i < myArray.length; i++) { System.out.println(i + 1 + ":" + myArray[i]); } } Επεξ/σία 20 Μαΐου 2014 από Dark_Sage
nplatis Δημοσ. 22 Μαΐου 2014 Δημοσ. 22 Μαΐου 2014 Αφού θέλεις τα στοιχεία σου να μην επαναλαμβάνονται, η πιο εύκολη δομή που μπορείς να χρησιμοποιήσεις είναι η Set<>, η οποία εγγυάται ότι τα στοιχεία της είναι μοναδικά, δηλαδή αν βάλεις δυο φορές το ίδιο στοιχείο απλά δεν θα το κρατήσει δεύτερη φορά. Ακολουθεί spoiler: import java.util.HashSet; import java.util.Random; import java.util.Set; public class RandGen { public static void main(String[] args) { Set<Integer> numbers = new HashSet<>(5); Random gen = new Random(); while (numbers.size() < 5) { int r = 1 + gen.nextInt(45); numbers.add(r); } System.out.println(numbers); } } 2
tazos87 Δημοσ. 24 Μαΐου 2014 Μέλος Δημοσ. 24 Μαΐου 2014 Παιδιά ευχαριστώ πολύ! Είδα οτι καποια που χρησιμοποιείτε δεν τα έχω πετύχει ακόμα....οπότε θα ανατρέξω αργότερα αφού βλέπω παντού πράγματα που δεν τα ξέρω(αρχή είμαι ακόμα). Είναι φοβερό το πόσοι τρόποι μπορεί να υπάρχουν για να κάνει κανείς κάτι... Τα λέμε εδώ γύρω
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα