Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [JAVA] - Generare casualmente segno + o -

    Ciao a tutti!!
    Allora oggi ho un nuovo problema...in prattica ho un quadrato con centro in 0 e lato = 2. cioè con tutti i valori interni compresi tra -1 e 1...

    Per generare un punto casuale del quadrato di coordinate (x,y) ho fatto così
    codice:
     
    // Per generare un valore uguale a 0, -1 o 1
    double xSign = generator.nextInt(3) - 1;
    double ySign = generator.nextInt(3) - 1;
    
    // Per generare una posizione compresa tra 0 e 1
    double xPos = generator.nextDouble() * xSign;
    double yPos = generator.nextDouble() * ySign;
    Tuttavia il programma dà risultati parecchio sballati, in quanto, ovviamente, mi esce molte volte una posizione uguale a 0. Ho ovviato il problema traslando il quadrato di un'unità, ma il mio quesito è: è possibile generare un numero casuale compreso tra -1 e 1, evitando quindi lo 0? Oppure esiste qualche metodo che genera casualmente un segno positivo o negativo?

    Grazie a tutti per le risposte

  2. #2
    Yesss penso di aver risolto dopo vari sbattimenti con il metodo nextBoolean. E' proprio vero che a volte scrivere i propri pensieri è parecchio utile XD

    Per chi avesse il mio stesso problema ecco come ho risolto
    codice:
    		// Generare casualmente segno
    		int xSign, ySign;
    		boolean sign1 = generator.nextBoolean();
    		if(sign1)
    			xSign = 1;
    		else
    			xSign = -1;
    		boolean sign2 = generator.nextBoolean();
    		if(sign2)
    			ySign = 1;
    		else
    			ySign = -1;
    
    		// Per generare una posizione compresa tra 0 e 1
    		double xPos = generator.nextDouble() * xSign;
    		double yPos = generator.nextDouble() * ySign;
    Ovviamente sono sempre ben accetti consigli e suggerimenti

    ty to all

  3. #3
    Ultimamente non sei l'unico che posta questioni relative alla generazione di numeri casuali in un dato intervallo, posto questa minuscola classettina che ho buttato giù, magari può essere utile a te o ad altri

    codice:
    public class RandomGeneratorImproved {
    
        private double min;
        private double max;
    
        public RandomGeneratorImproved() {
    	this.min = 0.0;
    	this.max = 0.1;
        }
    
        //volutamente priva di setter singoli per evitare problemi di congruenza
        //(max < min)
        public RandomGeneratorImproved(double min, double max) {
    	if(min <= max)
    	{
    	    this.min = min;
    	    this.max = max;
    	}
        }
    
        public double getMin() {
    	return min;
        }
    
        public double getMax() {
    	return max;
        }
    
        //ritorna un numero reale compreso nell'intervallo
        public double getRandom()
        {
    	return Math.random() * (max - min) + min;
        }
    
        //ritorna un valore intero compreso nell'intervallo
        public long getRandomLong()
        {
    	return Math.round(getRandom());
        }
    
        //main class di esempio
        public static void main(String[] args) {
    	RandomGeneratorImproved generator = new RandomGeneratorImproved(-3,3);
    	for (int i = 0; i < 100; i++) {
    	    System.out.println(generator.getRandom());
    	}
    	for (int i = 0; i < 100; i++) {
    	    System.out.println(generator.getRandomLong());
    	}
        }
    }
    Come puoi vedere è molto banale, e non fa altro che rimappare il valore generato dalla funzione random (di default compreso tra 0.0 e 0.1) in un differente intervallo, sia esso più piccolo, più grande o traslato a destra o a sinistra rispetto ad esso
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  4. #4
    Originariamente inviato da tigerjack89
    Ovviamente sono sempre ben accetti consigli e suggerimenti
    Se il tuo intento è semplicemente quello di generare a caso numeri positivi e negativi, puoi fare così:
    codice:
    java.util.Map<Boolean, Integer> map = new java.util.HashMap<Boolean, Integer>();
    map.put(true, -1);
    map.put(false, 1);
    
    Random r = new Random();
    int myNum = map.get(r.nextBoolean()) * r.nextInt();

  5. #5
    Grazie mille ad entrambi per la risposta!

    @unomichisiada: yez il tuo programma è ottimo per generare numeri in un intervallo diverso da quello di default; tuttavia il mio problema non era generare casualmente numeri di un determinato intervallo, ma invece generare casualmente dei numeri prestabiliti. Nel mio caso specifico, dovevo generare un numero che fosse casualmente o 1 o -1.

    @VincenzoTheBest: ad intuito semba ottimo il tuo programma; solo che non ho proprio idea di cosa voglia dire la prima riga di codice. Ad occhio sembra la creazione di un pacchetto libreria da uno già esistente, ma non l'ho ancora studiato.
    Mi riprometto di approfondire di nuovo questa discussione una volta capito che cosa hai utilizzato

    ciauz

  6. #6
    Originariamente inviato da tigerjack89
    @unomichisiada: yez il tuo programma è ottimo per generare numeri in un intervallo diverso da quello di default; tuttavia il mio problema non era generare casualmente numeri di un determinato intervallo, ma invece generare casualmente dei numeri prestabiliti. Nel mio caso specifico, dovevo generare un numero che fosse casualmente o 1 o -1.
    ciauz
    La classe non è fatta per salvare il mondo , ovviamente a seconda del problema da risolvere va utilizzato qualche calcoletto in più per ottenere il risultato. Nel tuo caso specifico ad esempio

    codice:
    	RandomGeneratorImproved generator = new RandomGeneratorImproved(0,1);
    	for (int i = 0; i < 100; i++) {
    	    int rand = (int) generator.getRandomLong();
    	    System.out.println(2 * rand  - 1);
    	}
    Ottiene in maniere semplice o 1 o -1 ad ogni chiamata
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

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 © 2025 vBulletin Solutions, Inc. All rights reserved.