Java - Rellenar vector con 1000000 de numeros al azar

 
Vista:

Rellenar vector con 1000000 de numeros al azar

Publicado por Dario (1 intervención) el 21/08/2019 07:01:50
Hola a todos, estoy en un curso de estructura da datos enfocado en Java y tengo la tarea de rellenar un "vector" con numeros del 1 al 1000000 aleatorios sin que se repitan, pero el programa debe de ejecutarse en maximo 2 segundos, dijo que usaramos la clase Collection pero no le hallo ya que dijo que investigaramos y he tratado de usar varios de los tipos de colecciones de la misma clase pero no me sale :c
Algun consejo?
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
sin imagen de perfil
Val: 33
Ha aumentado 1 puesto en Java (en relación al último mes)
Gráfica de Java

Rellenar vector con 1000000 de numeros al azar

Publicado por frank (15 intervenciones) el 21/08/2019 21:23:57
que tipos has puesto? que has hecho?
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
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

Rellenar vector con 1000000 de numeros al azar

Publicado por Kabuto (1381 intervenciones) el 22/08/2019 00:45:13
¿Y cuántos números has de generar? EL enunciado no indica cuál es el objetivo, más allá del tiempo.

A ver, lo ideal para este caso es usar un HashSet, porque a parte de ser el más rápido iterando (recorriendo sus elementos), no acepta valores repetidos. Es decir, automáticamente te va a rechazar números repetidos sin que tengas que hacer nada para asegurarte de que se cumple este punto del enunciado.

Mira, te dejo un código que genera aleatorios hasta conseguir 1 millón de números NO repetidos.

He puesto como objetivo 1 millón porque en mi ordenador (un AMD Ryzen 3700X) los consigue en poco más de 2 segundos, alguna vez lo ha conseguido en 1.97 segundos.

En ordenadores menos potentes puede necesitar más tiempo, así que puedes establecer un objetivo menor e ir aumentándolo poco a poco hasta alcanzar los 2 segundos.

Por placer, he puesto en el programa también un contador de la cantidad de números que son rechazados por el HashSet por estar repetidos.
Este cálculo extra puede hacer aumentar algunos milisegundos el tiempo necesario para completar el proceso, así que lo puedes quitar si quieres. Pero vamos, el impacto es muy bajo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Rellenar {
 
	public static void main(String[] args) {
 
		HashSet<Integer> numeros = new HashSet<Integer>();
		System.out.println("Tamaño del HashSet antes de generar números: " + numeros.size());
		int rechazados = 0;
		long tiempoInicial = System.currentTimeMillis();
		while(numeros.size() < 1_000_000) { //Objetivo, conseguir 1 millón de números sin repetirse
		    if (!numeros.add((int)((Math.random()*1_000_000) + 1)))
		    	rechazados++;
		}
		long tiempoFinal = System.currentTimeMillis();
		System.out.println("Tamaño del HashSet despues de generar números: " + numeros.size());
		System.out.println("Cantidad números rechazados: " + rechazados);
		System.out.printf("Segundos transcurridos: %.2f", (tiempoFinal - tiempoInicial)/1000f);
 
	}
 
}


EDITO:
Uooo, nuevo record

1
2
3
4
Tamaño del HashSet antes de generar números: 0
Tamaño del HashSet despues de generar números: 1000000
Cantidad números rechazados: 11148618
Segundos transcurridos: 1,92
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
Imágen de perfil de Rodrigo
Val: 2.041
Plata
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Rellenar vector con 1000000 de numeros al azar

Publicado por Rodrigo (623 intervenciones) el 22/08/2019 04:34:48
Se puede producir la no repeticion por construccion, en vez de hacer que se repitan y que sea la estructura de datos la que chequee (y se pierda tiempo en ello).

Si construyes los datos no repetidos inicialmente, ademas de hacerlos aleatorios, lo unico que tienes que hacer es insertarlos uno a uno en una coleccion que los acepte secuencialmente, como un ArrayList.

Si lo haces asi, ademas el tiempo sera menor a 1 segundo.
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
sin imagen de perfil
Val: 33
Ha aumentado 1 puesto en Java (en relación al último mes)
Gráfica de Java

Rellenar vector con 1000000 de numeros al azar

Publicado por frank (15 intervenciones) el 22/08/2019 06:16:25
3700x
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
sin imagen de perfil
Val: 144
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Rellenar vector con 1000000 de numeros al azar

Publicado por Thanatos (97 intervenciones) el 22/08/2019 06:39:37
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
 
class ListaNumeros {
 
    public static void main(String[] args) {
        List<Integer> numeros = new ArrayList<Integer>();
        long tInicial = System.currentTimeMillis();
 
        for (int i = 1; i <= 1000000; ++i) {
            numeros.add(i);
        }
        Collections.shuffle(numeros);
 
        long tFinal = System.currentTimeMillis();
        System.out.printf("Tiempo: %.2f segundos\n", (tFinal - tInicial) / 1000F);
    }
 
}
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
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

Rellenar vector con 1000000 de numeros al azar

Publicado por Kabuto (1381 intervenciones) el 22/08/2019 11:10:33
Otra variante sería poner como objetivo esos dos segundos.
Es decir, a ver cuantos números sin repetir se consiguen generar en dos segundos de tiempo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Rellenar {
 
	public static void main(String[] args) {
 
		HashSet<Integer> numeros = new HashSet<Integer>();
		System.out.println("Tamaño del HashSet antes de generar números: " + numeros.size());
		int rechazados = 0;
	    long tiempoActual = 0L;
		long tiempoInicial = System.currentTimeMillis();
		do {
		    if (!numeros.add((int)((Math.random()*1_000_000) + 1)))
		    	rechazados++;
		    tiempoActual = System.currentTimeMillis();
		} while(tiempoActual - tiempoInicial < 2000); //Objetivo, 2 segundos
		System.out.println("Tamaño del HashSet despues de generar números: " + numeros.size());
		System.out.println("Cantidad números rechazados: " + rechazados);
		System.out.printf("Segundos transcurridos: %.2f", (tiempoActual - tiempoInicial)/1000f);
 
	}
 
}

Resultado en consola:
1
2
3
4
Tamaño del HashSet antes de generar números: 0
Tamaño del HashSet despues de generar números: 999999
Cantidad números rechazados: 11848689
Segundos transcurridos: 2,00
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
Imágen de perfil de Rodrigo
Val: 2.041
Plata
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Rellenar vector con 1000000 de numeros al azar

Publicado por Rodrigo (623 intervenciones) el 22/08/2019 20:35:04
El tamano del vector es de tamano 1 millon tambien?

(Referencia: "tengo la tarea de rellenar un "vector" con numeros del 1 al 1000000" )
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