Visualizzazione dei risultati da 1 a 7 su 7

Discussione: [JAVA] Numeri casuali

  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    10

    [JAVA] numeri casuali

    Stavo cercando di scrivere un programmino che faccia la seguente cosa:
    prendiamo tre scatole, di cui una sola è piena ma non sappiamo quale (rappresentiamo questa cosa con un array do boolean falsi tranne uno vero).

    Ora scegliamo una scatola a caso. Dopodiché "scartiamo" una scatola vuota tra le due rimanenti.

    Alla fine "cambiamo" scelta di scatola, e controlliamo se abbiamo scelto quella piena o no, e se è piena facciamo successi++;

    Spero di essere stato abbastanza chiaro

    bene, il programmino che ho fatto è questo:

    codice:
    import java.util.Random;
    
    public class probCasse {
        
        public static void main(String[]x){
        
        boolean[] casse = new boolean[3];
        int i, successi=0, vecchiascatola, randomInt;
        
        for(i=0;i<=2147483647;i++){
            casse[0]=casse[1]=casse[2]=false;
            
            Random randomGenerator = new Random();
            randomInt = randomGenerator.nextInt(3);
            casse[randomInt]=true; //scatola vincente presa a caso
            
            Random randomGenerator2 = new Random();
            vecchiascatola = randomGenerator2.nextInt(3); //scegliamo una scatola a caso
            
            do{   //scarta a caso una cassa vuota tra le due false che non sia quella scelta
                randomGenerator = new Random();
                randomInt = randomGenerator.nextInt(3);
            }while(casse[randomInt] || randomInt==vecchiascatola);
            
                
            //randomInt e' la scatola scartata, vecchiascatola e' la scatola che avevamo scelto prima.
            for(i=0;i<3;i++)
                if(i!=randomInt && i!=vecchiascatola)break;
                
            //ora i e' la nuova scatola scelta
            if(casse[i])successi++;
    
            
        }
        
        System.out.println("Hai vinto il " + 100*successi/2147483647 + "% delle volte");
        
        }
        
    }
    Viene compilato senza errori, ma in esecuzione non dà nessun output, secondo me perché i numeri generati in questo modo non sono casuali al 100%.
    Chi mi sa aiutare?


    Grazie in anticipo

  2. #2
    Utente di HTML.it L'avatar di Pacio88
    Registrato dal
    Sep 2007
    Messaggi
    447
    Prima di tutto ti consiglio di contattare un moderatore e far spostare questa discussione nella sezione di Java.

    Venendo al tuo problema se il programma non genera nessun output molto probebilmente è perchè non arriva ad eseguire la riga di condice dove è invocato il metodo println() e non perchè il generatore non genera numeri casuali correttamente. Il fatto che non sia eseguito una parte di codice lascia pensare che il tuo programma entri in un ciclo infinito.

    P.S. Se non ti fidi del funzionamento della classe random prova questo codice:
    codice:
    Random numberRandom = new Random();     
    int zero = 0, uno = 0;      
    for(int i=0; i<100000; i++) {         
        int y = numberRandom.nextInt(2);        
        if(y == 0)             
            zero++;         
        else             
            uno++;     
    }     
    System.out.println("zero: " + zero + ", uno: " + uno);
    EDIT: Benvenuto nel forum, mi sono accorto solo adesso che sei nuovo...

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    10
    Grazie del benvenuto!!

    In effetti pare che la classe random funzioni per benino

    Immagino che il ciclo infinito sia quel do while..
    Ora provo a dargli un'occhiatina anche se è tardi

    edit: che stupido, ho usato la variabile i dentro il for..

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    10
    Ho modificato il programma in modo da fargli fare solo 100 cicli, e ora arriva fino alla fine.
    Però la variabile successi rimane a 0..

    codice:
    import java.util.Random;
    
    public class probCasse {
    	
    	public static void main(String[]x){
    	
    	boolean[] casse = new boolean[3];
    	int i, j, successi=0, vecchiascatola, randomInt;
    	
    	//for(j=0;j<2147483647;j++){
    		for(j=0;j<100;j++){
    		
    		for(i=0;i<3;i++)casse[i]=false;
    		
    		Random randomGenerator = new Random();
            randomInt = randomGenerator.nextInt(3);
    		casse[randomInt]=true; //scatola vincente presa a caso
    		
    		Random randomGenerator2 = new Random();
            vecchiascatola = randomGenerator2.nextInt(3); //scegliamo una scatola a caso
            
            //System.out.println("randomInt:" + randomInt + "\nvecchiascatola: " + vecchiascatola);
    		
    		do{   //scarta a caso una cassa vuota tra le due false che non sia quella scelta
    			randomGenerator = new Random();
                randomInt = randomGenerator.nextInt(3);
                if(!casse[randomInt] && randomInt!=vecchiascatola)break;
    		}while(true);
    		
    			
    		//randomInt e' la scatola scartata, vecchiascatola e' la scatola che avevamo scelto prima.
    		for(i=0;i<3;i++)
    			if(i!=randomInt && i!=vecchiascatola)break;
    			
    		//ora i e' la nuova scatola scelta
    		if(casse[i])successi++;
    		
    	}
    	
    	//System.out.println("Hai vinto il " + 100*successi/2147483646 + "% delle volte");
    	System.out.println("Hai vinto il " + successi + "% delle volte");
    	
    	}
    	
    }

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    10
    Mettendo un paio di print di controllo in questi punti del codice:

    codice:
    Random randomGenerator = new Random();
            randomInt = randomGenerator.nextInt(3);
    		casse[randomInt]=true; //scatola vincente presa a caso
    		
    		System.out.println("randomInt:" + randomInt);
    		
    		randomGenerator = new Random();
            vecchiascatola = randomGenerator.nextInt(3); //scegliamo una scatola a caso
            
    	System.out.println("vecchiascatola: " + vecchiascatola);
    ho scoperto che randomInt a vecchiascatola assumono lo stesso valore..
    come mai?

  6. #6
    Utente di HTML.it L'avatar di Pacio88
    Registrato dal
    Sep 2007
    Messaggi
    447
    Il fatto che assumino lo stesso valore è casuale. Comunque ti faccio notare che è sufficiente inizializzare un oggetto una sola volta e non come fai tu con la classe Random ogni volta lo devi usare, per esempio:
    codice:
    ...
    Random randomNumber = new Random();
    int x1 = rundomNumber.nextInt(10);
    int x2 = rundomNumber.nextInt(10);
    int x3 = rundomNumber.nextInt(10);
    ...

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    10
    si si avevo risolto
    grazie lo stesso

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.