Java - Como generar numeros aleatorios

 
Vista:

Como generar numeros aleatorios

Publicado por C3LLY (3 intervenciones) el 07/05/2020 16:34:52
Necesito crear una pantalla que genere una primitiva de forma aleatoria. Cada número no puede repetirse con ninguno de los anteriores. Los números se generan al pulsar el botón de “Generar”.

He generado este código pero me repite los números en los diferentes JTextField y no se pueden repetir.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package p5_t6;
 
 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.JButton;
import java.awt.Font;
 
//The main of this exercise is Principal2
public class EX2 extends JFrame {
	/**
	 *
	 */
	private static final long serialVersionUID = 1L;
	private JTextField Texto1;
	private JTextField Texto2;
	private JButton Boton2;
	private JButton Boton1 ;
	public EX2() {
		setBounds(100,100,641,300);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		getContentPane().setLayout(null);
 
		Texto1 = new JTextField();
		Texto1.setBounds(52, 73, 146, 26);
		getContentPane().add(Texto1);
		Texto1.setColumns(10);
 
		JLabel Etiqueta1 = new JLabel("Derecho");
		Etiqueta1.setBounds(52, 41, 69, 20);
		getContentPane().add(Etiqueta1);
 
		JLabel Etiqueta2 = new JLabel("Rev\u00E9s");
		Etiqueta2.setBounds(307, 41, 69, 20);
		getContentPane().add(Etiqueta2);
 
		Texto2 = new JTextField();
		Texto2.setBounds(301, 73, 146, 26);
		getContentPane().add(Texto2);
		Texto2.setColumns(10);
 
		Boton2 = new JButton(">");
		Boton2.setFont(new Font("Tempus Sans ITC", Font.BOLD, 16));
		Boton2.setBounds(213, 122, 73, 48);
		Boton2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e ){
 
				String aux=Texto1.getText();
				Texto2.setText(aux);
				Texto1.setText("");
 
			}
		});
		getContentPane().add(Boton2);
 
		Boton1 = new JButton("<");
		Boton1.setBounds(213, 65, 73, 43);
		Boton1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				String aux=Texto1.getText();
				Texto2.setText(aux);
				Texto1.setText("");
			}
		});
		getContentPane().add(Boton1);
	}
}
 
//Clase principal
package p5_t6;
 
public class Principal2 {
	public static void main(String[] args) {
 
					EX2 window = new EX2();
					window.setVisible(true);
 
	}
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Como generar numeros aleatorios

Publicado por Kabuto (1381 intervenciones) el 07/05/2020 17:23:15
Mmmh.. me parece que ese código no se corresponde con lo que describes.

En cualquier caso, una forma sencilla de obtener aleatorios sin que se repitan, es llenar una colección de datos, como un Vector o un ArrayList, con números consecutivos dentro del rango de valores que queremos tener.

Por ejemplo, si queremos valores entre 0 y 99, pues llenamos un Vector con números entre esos dos valores.

Cuando queramos un número al azar de esa lista, generamos un indice al azar, entre 0 y el tamaño actual de ese Vector.
Devolvemos el número que está en ese indice y acto seguido lo eliminamos del Vector. Así en las próximas veces es imposible que ese número se repita, porque lo hemos eliminado.

Al eliminar números, el Vector disminuye su tamaño, esto hay que tenerlo en cuenta cada vez que generamos el indice al azar.

Mira he escrito una clase que hace esto que describo, se puede añadir a cualquier proyecto que necesite números al azar sin repetir.
Genera valores enteros entre 0 y el máximo (excluido) que se le indique en el constructor.
Si le indicamos 100 en el constructor, da números entre 0 y 99. Si le indicamos 500, será entre 0 y 499, etc...

Está programado para que cuando los números se agoten, se vuelva a llenar de nuevo el Vector. Así que los valores solo se repetirán cuando se hayan agotado todos los valores posibles dentro del rango.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import java.util.Vector;
 
/**
 * Esta clase crea un objeto que devuelve números enteros al azar
 * dentro de un rango, sin que se repitan.<br>
 * El rango va desde el <b>0</b> (incluido) hasta el valor <b>máximo</b> (excluido)
 * que se le indique mediante el constructor.<br>
 * Cuando se agoten todos los valores posibles dentro del rango establecido
 * la lista de valores se reiniciará y solo entonces comenzarán a devolverse
 * valores repetidos.
 *
 * @author Kabuto
 * @version 07/05/2020
 *
 */
public class AzarSinRepetir {
 
	private Vector<Integer> numeros;
	private int maximo;
 
	public AzarSinRepetir(int maximo) {
		this.maximo = maximo;
		llenarVector();
	}
 
	/**
	 * LLena el Vector con números entre 0 (incluido)
	 * y el valor máximo(excluido).
	 */
	private void llenarVector() {
		numeros = new Vector<Integer>(maximo);
		for (int i = 0; i < maximo; i++)
			numeros.add(i);
	}
 
	/**
	 * Devuelve un número al azar de los que contiene el Vector.
	 * El número devuelto es eliminado del Vector, así que no
	 * podrá ser devuelto dos veces.<br>
	 * Cuándo los números a devolver se agoten, el Vector se
	 * llenará de nuevo.
	 * @return Valor Integer al azar e irrepetible.
	 */
	public Integer getNumero() {
		if (numeros.isEmpty())
			llenarVector();
 
		int indice = (int) (Math.random() * numeros.size());
		return numeros.remove(indice);
	}
 
	/**
	 * Informa de cuántos valores Integer
	 * quedan disponibles para ser retornados.
	 * @return Valores restantes en el Vector
	 */
	public int valoresRestantes() {
		return numeros.size();
	}
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar