sí, pero tienes que decir que generatores una instancia dejava.util.Random
stivlo
26
No crearía Random()cada vez que ejecutas la función: se supone que el generador aleatorio tiene historial. Si no es así, es extremadamente predecible. No es un problema en absoluto en este caso, pero debe mencionarse que array[(int)(System.currentTimeMillis() % array.length)]es tan bueno como la solución propuesta.
alf
6
@alf, eso está lejos de ser tan bueno como la solución propuesta. new Random()intenta crear una instancia que tiene una semilla diferente a cualquier creada anteriormente Random. Su enfoque se rompería horriblemente con solo invocar la función dos veces en poco tiempo.
aioobe
1
@alf, algunos sistemas no tienen un reloj con una precisión de milisegundos, lo que puede excluir algunas opciones sigcd(array.length,clockAccuracy)!=1
fanático del trinquete
3
Acabo de notar una notificación de que voté en contra de esta respuesta; debí haber hecho clic en ella accidentalmente; desafortunadamente, la interfaz no me deja deshacerlo (dice que no puedo cambiar mi voto a menos que se edite la respuesta ...). Entonces, disculpas a Chris Dennett.
Peter Hanley
13
Puede usar el generador aleatorio para generar un índice aleatorio y devolver el elemento en ese índice:
Si está eligiendo elementos de matriz aleatorios que deben ser impredecibles, debe usar java.security.SecureRandom en lugar de Random. Eso asegura que si alguien conoce las últimas selecciones, no tendrá ventaja para adivinar la siguiente.
use java.util.Randompara generar un número aleatorio entre 0 y la longitud de la matriz:, random_numbery luego use el número aleatorio para obtener el entero:array[random_number]
Así que baraja una lista con O(nlogn)complejidad de tiempo, hace la copia dos veces usando el total de 3 veces más memoria que la matriz inicial, aunque el problema que OP preguntó se puede resolver con O(1)complejidad de tiempo y O(1)memoria ...?
Jaroslaw Pawlak
sí, tienes razón, era mejor hacerlo con una constante complejidad temporal y espacial.
Ravi Sapariya
0
package io.github.baijifeilong.tmp;import java.util.concurrent.ThreadLocalRandom;import java.util.stream.Stream;/**
* Created by [email protected] at 2019/1/3 下午7:34
*/publicclassBar{publicstaticvoid main(String[] args){Stream.generate(()->null).limit(10).forEach($ ->{System.out.println(newString[]{"hello","world"}[ThreadLocalRandom.current().nextInt(2)]);});}}
Respuestas:
fuente
generator
es una instancia dejava.util.Random
Random()
cada vez que ejecutas la función: se supone que el generador aleatorio tiene historial. Si no es así, es extremadamente predecible. No es un problema en absoluto en este caso, pero debe mencionarse quearray[(int)(System.currentTimeMillis() % array.length)]
es tan bueno como la solución propuesta.new Random()
intenta crear una instancia que tiene una semilla diferente a cualquier creada anteriormenteRandom
. Su enfoque se rompería horriblemente con solo invocar la función dos veces en poco tiempo.gcd(array.length,clockAccuracy)!=1
Puede usar el generador aleatorio para generar un índice aleatorio y devolver el elemento en ese índice:
fuente
Si va a obtener un elemento aleatorio varias veces, debe asegurarse de que su generador de números aleatorios se inicialice solo una vez.
Si está eligiendo elementos de matriz aleatorios que deben ser impredecibles, debe usar java.security.SecureRandom en lugar de Random. Eso asegura que si alguien conoce las últimas selecciones, no tendrá ventaja para adivinar la siguiente.
Si está buscando elegir un número aleatorio de una matriz de objetos utilizando genéricos, puede definir un método para hacerlo (Fuente Avinash R en elemento aleatorio de la matriz de cadenas ):
fuente
use
java.util.Random
para generar un número aleatorio entre 0 y la longitud de la matriz:,random_number
y luego use el número aleatorio para obtener el entero:array[random_number]
fuente
Utilice la clase Random :
fuente
También puedes usar
Math.random()
devuelvedouble
entre0.0
(inclusivo) a1.0
(exclusivo)Multiplicar esto por
array.length
te dadouble
entre0.0
(inclusivo) yarray.length
(exclusivo)La transmisión a
int
se redondeará hacia abajo y le dará un número entero entre0
(inclusive) earray.length-1
(inclusive)fuente
Dado que tiene Java 8, otra solución es utilizar Stream API.
Donde
1
es el int más bajo generado (incluido) y500
es el más alto (exclusivo).limit
significa que su transmisión tendrá una longitud de 500.Aleatorio es del
java.util
paquete.fuente
Eche un vistazo a esta pregunta:
¿Cómo genero números enteros aleatorios dentro de un rango específico en Java?
Querrá generar un número aleatorio desde 0 hasta la longitud de sus enteros - 1. Luego, simplemente obtenga su int de su matriz:
fuente
Java tiene una clase Random en el paquete java.util. Usándolo puede hacer lo siguiente:
¡Espero que esto ayude!
fuente
fuente
También puede probar este enfoque.
fuente
O(nlogn)
complejidad de tiempo, hace la copia dos veces usando el total de 3 veces más memoria que la matriz inicial, aunque el problema que OP preguntó se puede resolver conO(1)
complejidad de tiempo yO(1)
memoria ...?fuente