Como faço para gerar um int
valor aleatório em um intervalo específico?
Eu tentei o seguinte, mas esses não funcionam:
Tentativa 1:
randomNum = minimum + (int)(Math.random() * maximum);
// Bug: `randomNum` can be bigger than `maximum`.
Tentativa 2:
Random rn = new Random();
int n = maximum - minimum + 1;
int i = rn.nextInt() % n;
randomNum = minimum + i;
// Bug: `randomNum` can be smaller than `minimum`.
Respostas:
No Java 1.7 ou posterior , a maneira padrão de fazer isso é a seguinte:
Veja o JavaDoc relevante . Essa abordagem tem a vantagem de não precisar inicializar explicitamente uma instância java.util.Random , que pode ser uma fonte de confusão e erro se usada de forma inadequada.
No entanto, inversamente, não há como definir explicitamente a semente para que seja difícil reproduzir resultados em situações que sejam úteis, como testar ou salvar estados de jogos ou similares. Nessas situações, a técnica pré-Java 1.7 mostrada abaixo pode ser usada.
Antes do Java 1.7 , a maneira padrão de fazer isso é a seguinte:
Veja o JavaDoc relevante . Na prática, a classe java.util.Random geralmente é preferível a java.lang.Math.random () .
Em particular, não há necessidade de reinventar a roda de geração inteira aleatória quando houver uma API direta na biblioteca padrão para realizar a tarefa.
fonte
max
valor éInteger.MAX_VALUE
possível, é possível transbordar, resultando em ajava.lang.IllegalArgumentException
. Você pode tentar com:randInt(0, Integer.MAX_VALUE)
. Além disso, senextInt((max-min) + 1)
retornar o valor mais alto (bastante raro, presumo), ele não excederá novamente (supondo que min e max sejam altos o suficiente)? Como lidar com esse tipo de situação?ThreadLocalRandom
foi adicionado ao Java dois anos e meio após a primeira pergunta. Eu sempre sou da opinião firme de que o gerenciamento da instância Random está fora do escopo da questão.Observe que essa abordagem é mais tendenciosa e menos eficiente do que uma
nextInt
abordagem, https://stackoverflow.com/a/738651/360211Um padrão padrão para realizar isso é:
A função da biblioteca Java Math Math.random () gera um valor duplo no intervalo
[0,1)
. Observe que esse intervalo não inclui o 1.Para obter um intervalo específico de valores primeiro, você precisa multiplicar pela magnitude do intervalo de valores que deseja cobrir.
Isso retorna um valor no intervalo
[0,Max-Min)
, em que 'Max-Min' não está incluído.Por exemplo, se você quiser
[5,10)
, precisará cobrir cinco valores inteiros para usarIsso retornaria um valor no intervalo
[0,5)
, em que 5 não está incluído.Agora você precisa mudar esse intervalo para o que você está segmentando. Você faz isso adicionando o valor mínimo.
Agora você receberá um valor no intervalo
[Min,Max)
. Seguindo o nosso exemplo, isso significa[5,10)
:Mas, isso ainda não inclui
Max
e você está recebendo um valor duplo. ParaMax
incluir o valor, você precisa adicionar 1 ao parâmetro range(Max - Min)
e truncar a parte decimal convertendo para int. Isso é realizado via:E aí está. Um valor inteiro aleatório no intervalo
[Min,Max]
ou pelo exemplo[5,10]
:fonte
Usar:
O número inteiro
x
agora é o número aleatório com um possível resultado5-10
.fonte
Usar:
fonte
Com java-8eles introduziram o método
ints(int randomNumberOrigin, int randomNumberBound)
naRandom
classe.Por exemplo, se você deseja gerar cinco números inteiros aleatórios (ou um único) no intervalo [0, 10], basta:
O primeiro parâmetro indica apenas o tamanho do
IntStream
gerado (que é o método sobrecarregado daquele que produz um número ilimitadoIntStream
).Se você precisar fazer várias chamadas separadas, poderá criar um iterador primitivo infinito a partir do fluxo:
Você também pode fazer isso por
double
elong
valores. Espero que ajude! :)fonte
streamSize
- o primeiro parâmetro deste método fornecidostreamSize !=0
. Qual é a diferença sestreamSize
1/2 / n é dado?Você pode editar seu segundo exemplo de código para:
fonte
Apenas uma pequena modificação da sua primeira solução seria suficiente.
Veja mais aqui para implementação de
Random
fonte
ThreadLocalRandom
equivalente a classejava.util.Random
para ambiente multithread. A geração de um número aleatório é realizada localmente em cada um dos encadeamentos. Portanto, temos um desempenho melhor reduzindo os conflitos.x
,y
- intervalos, por exemplo (1,10)fonte
A
Math.Random
classe em Java é baseada em 0. Então, se você escrever algo como isto:x
será entre0-9
inclusivo.Portanto, considerando a seguinte matriz de
25
itens, o código para gerar um número aleatório entre0
(a base da matriz) earray.length
seria:Como
i.length
retornará25
, onextInt( i.length )
retornará um número entre o intervalo de0-24
. A outra opção é aMath.Random
que funciona da mesma maneira.Para uma melhor compreensão, consulte a publicação no fórum Random Interals (archive.org) .
fonte
index
variável não afetará o resultado do número aleatório. Você pode optar por inicializá-lo da maneira que desejar, sem precisar se preocupar em alterar o resultado. Espero que isto ajude.int index = rand.nextInt(i.Length);
int index; \n index = rand...
se alguém gosta de declarações e atribuições em linhas diferentes. Alguns padrões de codificação são mais rigorosos (e sem propósito aparente) do que outros.Perdoe-me por ser meticuloso, mas a solução sugerida pela maioria, ou seja
min + rng.nextInt(max - min + 1))
, parece perigosa devido ao fato de que:rng.nextInt(n)
não pode alcançarInteger.MAX_VALUE
.(max - min)
pode causar estouro quandomin
negativo.Uma solução infalível retornaria resultados corretos para qualquer
min <= max
um dos [Integer.MIN_VALUE
,Integer.MAX_VALUE
]. Considere a seguinte implementação ingênua:Embora ineficiente, observe que a probabilidade de sucesso no
while
loop sempre será 50% ou superior.fonte
Isso pode ser feito simplesmente com a declaração:
Abaixo está o código fonte
Randomizer.java
É apenas limpo e simples.
fonte
Gostaria de saber se algum dos métodos aleatórios de geração de número fornecidos por um Apache Commons Math biblioteca de se encaixaria na conta.
Por exemplo:
RandomDataGenerator.nextInt
ouRandomDataGenerator.nextLong
fonte
Vamos dar um exemplo.
Suponha que eu deseje gerar um número entre 5 e 10 :
Vamos entender isso ...
fonte
fonte
Gere um número aleatório para a diferença de min e max usando o método nextint (n) e adicione o número mínimo ao resultado:
fonte
Eu uso isso:
Você pode convertê-lo em um número inteiro, se desejar.
fonte
new Random
(verifique o JavaDoc): "Cria um novo gerador de números aleatórios. Esse construtor define a semente do gerador de números aleatórios com um valor muito provável de ser distinto de qualquer outra invocação desse construtor." Muito provavelmente pode envolver apenas o uso do tempo atual como semente. Se esse tempo usar milissegundos, os computadores atuais serão rápidos o suficiente para gerar o mesmo número. Mas além disso 2147483647 éInteger.MAX_VALUE
; a saída obviamente depende da entrada que você não especificou.Joshua Bloch. Java eficaz. Terceira edição.
A partir do Java 8
Para pools de junção de forquilha e fluxos paralelos, o uso
SplittableRandom
geralmente mais rápido tem melhores propriedades de independência e uniformidade estatística em comparação comRandom
.Para gerar um aleatório
int
no intervalo[0, 1_000]:
Para gerar uma
int[100]
matriz aleatória de valores no intervalo[0, 1_000]:
Para retornar um fluxo de valores aleatórios:
fonte
.parallel()
? Parece-me que gerar 100 números aleatórios seria muito trivial para justificar o paralelismo.parallel
processamento). A propósito, para a matriz de1_000_000
elementos, aparallel
versão foi duas vezes mais rápida na minha máquina em comparação com a sequencial.Basta usar a classe Random :
fonte
Esses métodos podem ser convenientes de usar:
Este método retornará um número aleatório entre os valores mínimo e máximo fornecidos:
e esse método retornará um número aleatório do valor mínimo e máximo fornecido (portanto, o número gerado também pode ser o número mínimo ou máximo):
fonte
// Since the random number is between the min and max values, simply add 1
. Por quê? O min não conta? Geralmente, o intervalo é [min, max), onde min é incluído e max é excluído. Resposta errada, votada para baixo.min + 1
terá duas vezes mais chances de ser o resultado do outro númerogetRandomNumberBetween
!No caso de rolar um dado, seria um número aleatório entre 1 e 6 (não entre 0 e 6), portanto:
fonte
Ou dê uma olhada no RandomUtils do Apache Commons .
fonte
Double.valueOf(Math.random()*(maximum-minimun)).intValue()
é uma maneira bastante ofuscado (e ineficiente) para dizer(int)(Math.random()*(maximum-minimun))
...Aqui está uma classe útil para gerar aleatoriamente
ints
em um intervalo com qualquer combinação de limites inclusivos / exclusivos:fonte
Para gerar um número aleatório "entre dois números", use o seguinte código:
Isso fornece um número aleatório entre 1 (inclusive) e 11 (exclusivo), portanto, inicialize o valor upperBound adicionando 1. Por exemplo, se você deseja gerar um número aleatório entre 1 e 10, inicialize o número upperBound com 11 em vez de 10)
fonte
Você pode conseguir isso de forma concisa no Java 8:
fonte
fonte
Outra opção é apenas usar o Apache Commons :
fonte
Encontrei este exemplo: Gerar números aleatórios :
Este exemplo gera números inteiros aleatórios em um intervalo específico.
Um exemplo de execução desta classe:
fonte
É melhor usar o SecureRandom do que apenas o Random.
fonte
private static int SecureRandom rand = new SecureRandom();
2:static {
3:rand.setSeed(...);
4:}
SecureRandom
, ela será semeada pelo sistema. Chamar diretamentesetSeed
é muito perigoso, pode substituir a semente (realmente aleatória) pela data. E isso certamente não resultará em umSecureRandom
, pois qualquer um pode adivinhar o tempo e tentar propagar sua própriaSecureRandom
instância com essas informações.Aqui está um exemplo simples que mostra como gerar um número aleatório de
[min, max]
faixa fechada , enquantomin <= max is true
Você pode reutilizá-lo como campo na classe de furos, tendo todos os
Random.class
métodos em um só lugarExemplo de resultados:
Fontes:
fonte
Isso está funcionando bem.
fonte