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

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

Δημοσ.

Θέλω να φτιάξω μια γεννήτρια τυχαίων αριθμών από το 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			
		}
	}
}

Δημοσ.

Αυτό που κάνεις απλά θα σε προστάτευε από το να πάρεις τον ίδιο αριθμό δύο φορές στη σειρά, όχι γενικά.

 

Η καλύτερη μέθοδος για να πετύχεις το συγκεκριμένο αποτέλεσμα είναι το reservoir sampling, αλλά και με τη μέθοδο που λέει το παπί θα δουλέψει μια χαρά. Αυτό που πας κάνεις εδώ (έλεγχος των προηγούμενων επιλογών) είναι χειρότερο.

Δημοσ.

Ευχαριστω!

Πωω defacer, ναι...πως κόλλησα έτσι! (αφού είναι μόνο για το επόμενο)

 

Παπί καλό φαίνεται αυτό,απλά δεν τα έχω δει ακόμα δεν τα έχω μάθει ... αν έχετε υπόψιν κάποια άλλη πηγή να διαβάσω για πρώτη φορά,πείτε  :-D

Δημοσ.

Αντί να σπας το κεφάλι σου, μπορείς απλά να βάλεις σε μία γυάλα 45 αριθμούς, να τους τραβήξεις τυχαία και να καταγράψεις τα αποτελέσματα. 

 

Αυτά θα είναι και αυτά που θα επιστρέφει η συνάρτησή σου.

 

Π.χ.

 

13402d1393815743-programmer-jokes-random

  • Like 1
Δημοσ.

Παπί καλό φαίνεται αυτό,απλά δεν τα έχω δει ακόμα δεν τα έχω μάθει ... αν έχετε υπόψιν κάποια άλλη πηγή να διαβάσω για πρώτη φορά,πείτε  :-D

Και μεις την πρώτη φορά που τα είδαμε δεν τα είχαμε μάθει απο πιο πριν...

  • Like 1
Δημοσ.

Καταρχήν αυτό που έχεις γράψει δεν ελέγχει αν έχει ξαναεπιλεγεί ένας αριθμός αλλά αν στο τρέχον loop επιλέχθηκε ίδιος με του προηγούμενου loop. Για να πετύχεις αυτό που θες πρέπει να βάζεις τα αποτελέσματα σε έναν πίνακα και να τον ελέγχεις σε κάθε loop. Επίσης δεν δίνεις τιμή πουθενά στο newNum και η τελευταία γραμμή δεν είναι μάλλον αυτό που ήθελες.

Δημοσ.

Οκ, βρήκα έναν τρόπο,θα κοιτάξω και με άλλον,αλλά εξηγείστε μου κάτι αν γίνεται.

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)

 

Κάποιος αν μπορεί για να μπορέσω να προχωρήσω...Ευχαριστώ!

Δημοσ.

Δεν υποτίθεται οτι το μέγεθος δείχνει πόσους αριθμούς έχει η λίστα? (45)

 

Κάποιος αν μπορεί για να μπορέσω να προχωρήσω...Ευχαριστώ!

Θα μπορούσες πολύ απλά να κάνεις debug το πρόγραμμά σου και να δεις ότι σε κάθε επανάληψη το size μειώνεται και δεν παραμένει 45. Μετά από αυτό τα υπόλοιπα θα ήταν προφανή.

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

φίλε επειδή δεν ζήτησες την λύση αλλά το πάλεψες μόνος σου εγώ σου παραθέτω πιο κάτω μια λύση (αν δεν θέλεις άλλο να ταλαιπωρείσαι). Χρησιμοποίησα ενα 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]);
        }

    }

 

 

Επεξ/σία από Dark_Sage
Δημοσ.

Αφού θέλεις τα στοιχεία σου να μην επαναλαμβάνονται, η πιο εύκολη δομή που μπορείς να χρησιμοποιήσεις είναι η 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);
    }    

}
 

 

 

  • Like 2
Δημοσ.

Παιδιά ευχαριστώ πολύ!

Είδα οτι καποια που χρησιμοποιείτε δεν τα έχω πετύχει ακόμα....οπότε θα ανατρέξω αργότερα αφού βλέπω παντού πράγματα που δεν τα ξέρω(αρχή είμαι ακόμα).

Είναι φοβερό το πόσοι τρόποι μπορεί να υπάρχουν για να κάνει κανείς κάτι...

Τα λέμε εδώ γύρω  :)

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

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

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

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

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

Σύνδεση

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

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