Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Εχω το παρακατω προγραμμα που παραγει τυχαιες συμβολοσειρες ορισμενου μηκους μεσα απο μια 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; 
           } 
       } 
   } 
	
   } 
}

Επεξ/σία από christian-ago
Δημοσ.

Γιατι η remove αφου διαγραψει το στοιχειο, μεταφερει ολα τα υπολοιπα στοιχεια μια θεση αριστερα.

Θελω να διαγραψω το στοιχειο, αλλα επισης θελω και η θεση τους στη λιστα να ειναι σταθερη, να μη μετατιθενται τα στοιχεια.

Εφοσον αυτο δεν μπορει να γινει με καποια function αναγκαστικα εχω ξεμεινει με το null.

Δημοσ.

Λοιπόν, η word έχει τις λέξεις οι οποίες θα ενωθούν με τυχαίο τρόπο, σωστά;

Η joker έχει το αποτέλεσμα που θα παραχθεί;

Η take όμως που εξυπηρετεί;

Δημοσ.

Αμα βαλεις το 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);

Ετσι παιρνω ενα τυχαιο στοιχειο και οχι δεικτη απο τη λιστα. Ευχαριστω για τη βοηθεια.

Δημοσ.

Ίσως (εξαρτάται από τις ανάγκες σου) θα μπορούσε να γίνει και ως εξής:

 

>
       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: Μικροδιορθώσεις)

Δημοσ.

Πιο γρηγορο, αποτελεσματικο ποιο νομιζεις οτι ειναι;

Παντως δεν ξερω αν δουλευει ο τροπος σου στη δικη μου περιπτωση γιατι ενδεικτικα εδωσα ταξινομημενη τη λιστα με τα γραμματα.

Αν εχω λιστα σε τυχαια σειρα γραμματων τι γινεται;

Δημοσ.

Πιο γρηγορο, αποτελεσματικο ποιο νομιζεις οτι ειναι;

Παντως δεν ξερω αν δουλευει ο τροπος σου στη δικη μου περιπτωση γιατι ενδεικτικα εδωσα ταξινομημενη τη λιστα με τα γραμματα.

Αν εχω λιστα σε τυχαια σειρα γραμματων τι γινεται;

Κοίταξε αν το θέμα είναι να πάρεις ένα τυχαίο αλφαριθμητικό από μια λίστα με n γράμματα, με την προϋπόθεση ότι κάθε ένα εξ' αυτών θα πρέπει να χρησιμοποιηθεί άπαξ, τότε αρκεί να ανακατέψεις την σειρά των γραμμάτων που περιέχει η λίστα και ύστερα να διαβάσεις από την αρχή της λίστας ως το μέγεθος του αλφαριθμητικού που επιθυμείς να παράγεις τα όποια γράμματα βρίσκονται στις θέσεις αυτές.

 

Η αρχική ταξινόμηση της λίστας, από την στιγμή που θα την ανακατέψεις πριν την χρησιμοποιήσεις (μέσο shuffle) δεν έχει καμία πρακτική σημασία διότι έχει ήδη τροποποιηθεί.

Δημοσ.

Η ταξινομηση δεν εχει καμια σχεση με το προγραμμα. Εγω απλα εδειξα τα στοιχεια της λιστας ταξινομημενα.

Το τελικο προγραμμα θα εχει μια λιστα στην οποια η μονη τροποποιηση

που θα γινεται ειναι να τιθεται τα στοιχεια null,

που επιλεγονται "τυχαια" συμφωνα με τον παραπανω αλγοριθμο.

 

Μπορω μεσω της shuffle να παραγω τυχαιους μοναδικους αριθμους πχ. 5;

Και κατι αλλο γιατι γραφεις: Collections.shuffle(ChrArr, new Random());

To παρακατω δεν αρκει;

>Collections.shuffle(take);int s = take.get(0);

Δημοσ.

Μπορω μεσω της shuffle να παραγω τυχαιους μοναδικους αριθμους πχ. 5;

Η shuffle αναδιατάσσει με τυχαία σειρά το περιεχόμενο μιας λίστας.

 

Για την παραγωγή τυχαίων αριθμών ρίξε μια ματιά στην Random class και στις συναρτήσεις της, .nextInt(), .nextLong() κλπ.

 

Και κατι αλλο γιατι γραφεις: Collections.shuffle(ChrArr, new Random());

To παρακατω δεν αρκει;

>Collections.shuffle(take);int s = take.get(0);

Αρκεί, απλά εκ παραδρομής λόγο συνήθειας από την srand των C/C++.

Δημοσ.
Μπορω μεσω της shuffle να παραγω τυχαιους μοναδικους αριθμους πχ. 5;

 

Η shuffle αναδιατάσσει με τυχαία σειρά το περιεχόμενο μιας λίστας.

 

Για την παραγωγή τυχαίων αριθμών ρίξε μια ματιά στην Random class και στις συναρτήσεις της, .nextInt(), .nextLong() κλπ.

 

Εννοουσα μεσω του αλγοριθμου να παραγω τυχαια στοιχεια, οχι αμεσα απο τη shuffle.

 

Παντως ευχαριστω, topic solved!

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...