sim, mas você deve dizer que generatoré uma instância dejava.util.Random
stivlo
25
Eu não criaria Random()cada vez que você executasse a função: o gerador aleatório deveria ter histórico. Se não, é extremamente previsível. Não é um problema neste caso - mas deve ser mencionado que array[(int)(System.currentTimeMillis() % array.length)]é tão bom quanto a solução proposta.
alf
4
@alf, isso está longe de ser tão bom quanto a solução proposta. new Random()tenta criar uma instância que possui uma semente diferente de qualquer outra criada anteriormente Random. Sua abordagem seria horrível apenas invocando a função duas vezes em um curto espaço de tempo.
aioobe
1
@alf alguns sistemas não têm um relógio preciso milissegundo, o que pode impedir algumas opções segcd(array.length,clockAccuracy)!=1
loucura por catraca
3
Acabei de notar uma notificação de que votei abaixo do valor desta resposta - devo ter clicado acidentalmente; infelizmente, a interface não me deixa desfazer (diz que não posso mudar meu voto a menos que a resposta seja editada ...). Então, desculpas a Chris Dennett.
Peter Hanley
13
Você pode usar o gerador Random para gerar um índice aleatório e retornar o elemento nesse índice:
Se estiver escolhendo elementos de array aleatórios que precisam ser imprevisíveis, você deve usar java.security.SecureRandom em vez de Random. Isso garante que, se alguém souber as últimas escolhas, não terá vantagem em adivinhar a próxima.
Se você deseja escolher um número aleatório de uma matriz Object usando genéricos, pode definir um método para fazer isso (Fonte Avinash R no elemento Random da matriz de string ):
import java.util.Random;publicclassRandArray{privatestaticRandom rand =newRandom();privatestatic<T> T randomFrom(T... items){return items[rand.nextInt(items.length)];}}
use java.util.Randompara gerar um número aleatório entre 0 e o comprimento da matriz: random_numbere, em seguida, use o número aleatório para obter o inteiro:array[random_number]
Então você embaralha uma lista com O(nlogn)complexidade de tempo, faz a cópia dela duas vezes usando o total de 3 vezes mais memória do que o array inicial, embora o problema que o OP perguntou possa ser resolvido com O(1)complexidade de tempo e O(1)memória ...?
Jaroslaw Pawlak
sim, você tem razão, era melhor fazer com constante tempo e complexidade 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)]);});}}
Respostas:
fonte
generator
é uma instância dejava.util.Random
Random()
cada vez que você executasse a função: o gerador aleatório deveria ter histórico. Se não, é extremamente previsível. Não é um problema neste caso - mas deve ser mencionado quearray[(int)(System.currentTimeMillis() % array.length)]
é tão bom quanto a solução proposta.new Random()
tenta criar uma instância que possui uma semente diferente de qualquer outra criada anteriormenteRandom
. Sua abordagem seria horrível apenas invocando a função duas vezes em um curto espaço de tempo.gcd(array.length,clockAccuracy)!=1
Você pode usar o gerador Random para gerar um índice aleatório e retornar o elemento nesse índice:
fonte
Se você for obter um elemento aleatório várias vezes, certifique-se de que o gerador de números aleatórios seja inicializado apenas uma vez.
Se estiver escolhendo elementos de array aleatórios que precisam ser imprevisíveis, você deve usar java.security.SecureRandom em vez de Random. Isso garante que, se alguém souber as últimas escolhas, não terá vantagem em adivinhar a próxima.
Se você deseja escolher um número aleatório de uma matriz Object usando genéricos, pode definir um método para fazer isso (Fonte Avinash R no elemento Random da matriz de string ):
fonte
use
java.util.Random
para gerar um número aleatório entre 0 e o comprimento da matriz:random_number
e, em seguida, use o número aleatório para obter o inteiro:array[random_number]
fonte
Use a classe Random :
fonte
Você também pode usar
Math.random()
retorna umdouble
entre0.0
(inclusivo) a1.0
(exclusivo)Multiplicar isso por
array.length
dá a você um valordouble
entre0.0
(inclusivo) earray.length
(exclusivo)Cast para
int
arredondará para baixo, fornecendo a você um número inteiro entre0
(inclusivo) earray.length-1
(inclusivo)fonte
Como você tem o java 8, outra solução é usar a API Stream.
Onde
1
é o menor int gerado (inclusivo) e500
é o maior (exclusivo).limit
significa que seu stream terá uma duração de 500.Random é do
java.util
pacote.fonte
Dê uma olhada nesta questão:
Como faço para gerar inteiros aleatórios dentro de um intervalo específico em Java?
Você vai querer gerar um número aleatório de 0 até o comprimento de seus inteiros - 1. Em seguida, basta obter o seu int de sua matriz:
fonte
Java tem uma classe Random no pacote java.util. Usando-o, você pode fazer o seguinte:
Espero que isto ajude!
fonte
fonte
Você também pode tentar essa abordagem.
fonte
O(nlogn)
complexidade de tempo, faz a cópia dela duas vezes usando o total de 3 vezes mais memória do que o array inicial, embora o problema que o OP perguntou possa ser resolvido comO(1)
complexidade de tempo eO(1)
memória ...?fonte