Numeros Aleatorios entre 0 e 4601

Galera, como eu crio essa margem de numeros usando a Math.Random?

Como alterar o codigo abaixo para que isso aconteça?

valew

int aux = 0+(int)(10*Math.random()); 

Olá, Boa Noite.
Desta Forma:

int aux = (int)(Math.random()*4601);

onde 4601 é o número limite(máx).

Espero que ajude,
Vlw até+.

Amigo, número entre 4601 e 0, na teoria, ele aceita numero de 1 até 4600, correto?
Então vamos para um breve explicação.

O Math.random() gera um double de 0.0000… até 0.9999… .

Então, para conseguirmos um número que nos interesse, deveremos multiplicar o resultado desse random() pelo número requerido.

Supomos que o número sorteado seja 0.89935 e você queira de números até 10, o resultado da multiplicação será 8.9935. Para conseguirmos um número inteiro, deveremos dar um Type Cast nesse double, colocando entre parênteses o tipo int,
Ex:

int numSorteado = (int) 8.9935;

O resultado retornado será 8.
Observe o que type cast de um double ignora tudo que está a direita do ponto flutuante, ou seja, ele sempre te retorna a parte inteira.

Agora que você entendeu como funciona o type cast, vamos ver como manipular o random() para nos dar o número que queremos.

se você quiser um número de 0 até 10, você deverá multiplicar por 11.
Por quê?
Sabendo que o type cast para int sempre ignora o que está à direita do ponto flutuante, pense o seguinte:
Se o random() retorna no máximo 0,999…, se multiplicarmos por 10, o maior número depois da multiplicação que você irá conseguir será 9.999…
ao darmos o type cast, o resultado será 9.

Agora, se multiplicarmos por 11, o resultado máximo será algo como 10.9989, ao darmos o type cast, irá retornar o nosso tão experado 10.

ótimo, agora sabemos que o multiplicador do resultado do random() será sempre o número máximo que queremos + 1.
No nosso caso do exemplo: 10 + 1= 11;

Agora a pergunta matadora: E SE EU QUISER UM NÚMERO DE 5 ATÉ 10?
Impossível? nem um pouco, é muito simples:
continue na nossa lógica do numero máximo + 1.

10+1 = 11.
Com isso, sei que irá me retornar números de 0 até 11, mas para mim limitar para que me retorne o 5 como número mínimo?
retire esse valor do multiplicador, e some no resultado final…

Ex: Quero um número randômico entre 5 e 10:

int num = ((int) (Math.random()*(11-5))+5;

Agora a resposta do seu problema:

duas questões que você tem que entender:
Número entre x e y
Número de x até y.

No caso do título do seu problema, entendo que você quer número de 1 até 4600.

Então a resposta vai ser a seguinte:

int x = (int) (Math.random()*4600);
int resultFinal = x+1;

// mas por que diabos x+1?
// pq queremos o 1 como número minimo, e o número mínimo no random() é sempre 0.
//se ele sortear um 0, a multiplicação retornará 0, ai é acrescido 1 para  deixar possível essa questão.
//outra coisa, como eu quero que o número máximo seja 4600, eu devo multiplicar por 4600, o maior número sorteado será 4599, após o 1 ser acrescido, o resultado ficará 4600

Realmente, tem esse detalhe ainda. Primeiro número que pode ser sorteado é o 0, tendo que incrementar 1 no resultado final, bem lembrado.

[quote=ByIvo]Amigo, número entre 4601 e 0, na teoria, ele aceita numero de 1 até 4600, correto?
Então vamos para um breve explicação.

O Math.random() gera um double de 0.0000… até 0.9999… .

Então, para conseguirmos um número que nos interesse, deveremos multiplicar o resultado desse random() pelo número requerido.

Supomos que o número sorteado seja 0.89935 e você queira de números até 10, o resultado da multiplicação será 8.9935. Para conseguirmos um número inteiro, deveremos dar um Type Cast nesse double, colocando entre parênteses o tipo int,
Ex:

int numSorteado = (int) 8.9935;

O resultado retornado será 8.
Observe o que type cast de um double ignora tudo que está a direita do ponto flutuante, ou seja, ele sempre te retorna a parte inteira.

Agora que você entendeu como funciona o type cast, vamos ver como manipular o random() para nos dar o número que queremos.

se você quiser um número de 0 até 10, você deverá multiplicar por 11.
Por quê?
Sabendo que o type cast para int sempre ignora o que está à direita do ponto flutuante, pense o seguinte:
Se o random() retorna no máximo 0,999…, se multiplicarmos por 10, o maior número depois da multiplicação que você irá conseguir será 9.999…
ao darmos o type cast, o resultado será 9.

Agora, se multiplicarmos por 11, o resultado máximo será algo como 10.9989, ao darmos o type cast, irá retornar o nosso tão experado 10.

ótimo, agora sabemos que o multiplicador do resultado do random() será sempre o número máximo que queremos + 1.
No nosso caso do exemplo: 10 + 1= 11;

Agora a pergunta matadora: E SE EU QUISER UM NÚMERO DE 5 ATÉ 10?
Impossível? nem um pouco, é muito simples:
continue na nossa lógica do numero máximo + 1.

10+1 = 11.
Com isso, sei que irá me retornar números de 0 até 11, mas para mim limitar para que me retorne o 5 como número mínimo?
retire esse valor do multiplicador, e some no resultado final…

Ex: Quero um número randômico entre 5 e 10:

int num = ((int) (Math.random()*(11-5))+5;

Agora a resposta do seu problema:

duas questões que você tem que entender:
Número entre x e y
Número de x até y.

No caso do título do seu problema, entendo que você quer número de 1 até 4600.

Então a resposta vai ser a seguinte:

int x = (int) (Math.random()*4600);
int resultFinal = x+1;

// mas por que diabos x+1?
// pq queremos o 1 como número minimo, e o número mínimo no random() é sempre 0.
//se ele sortear um 0, a multiplicação retornará 0, ai é acrescido 1 para  deixar possível essa questão.
//outra coisa, como eu quero que o número máximo seja 4600, eu devo multiplicar por 4600, o maior número sorteado será 4599, após o 1 ser acrescido, o resultado ficará 4600

[/quote]

Eu particularmente não confio na Random pura do Java.

Normalmente eu utilizo a API Commons Math http://commons.apache.org/math/ que gera pra mim numeros aleatorios mais confiaveis.

por exemplo:

System.out.println(new RandomDataImpl().nextSecureInt(1, 50));//gera um int aleatório de entre 1 e 50. System.out.println(new RandomDataImpl().nextSecureHexString(20));//gera uma string com valores hexadecimais aleatórios de até 20 caracteres System.out.println(new RandomDataImpl().nextSecureLong(1, 50000000));//gera um long aleatório entre 1 e 50000000

Olá, Bom Dia.

Interessante, não tinha ouvido falar nessa API Commons Math ainda.
Vou baixar pra testar também.

Vlw, até+.

[quote=samirrolemberg]Eu particularmente não confio na Random pura do Java.

Normalmente eu utilizo a API Commons Math http://commons.apache.org/math/ que gera pra mim numeros aleatorios mais confiaveis.

por exemplo:

System.out.println(new RandomDataImpl().nextSecureInt(1, 50));//gera um int aleatório de entre 1 e 50. System.out.println(new RandomDataImpl().nextSecureHexString(20));//gera uma string com valores hexadecimais aleatórios de até 20 caracteres System.out.println(new RandomDataImpl().nextSecureLong(1, 50000000));//gera um long aleatório entre 1 e 50000000[/quote]

Melhor que usar o Math.random é usar a classe Random:

Random random = new Random(); int numero = random.nextInt(4602);

Já usei essa classe também. Realmente é melhor que o math.Random().

[quote=ViniGodoy]Melhor que usar o Math.random é usar a classe Random:

Random random = new Random(); int numero = random.nextInt(4602);[/quote]

[quote=gilmar.g]Já usei essa classe também. Realmente é melhor que o math.Random().

[quote=ViniGodoy]Melhor que usar o Math.random é usar a classe Random:

Random random = new Random(); int numero = random.nextInt(4602);[/quote][/quote]

Isto que iria dizer :wink:
Muito mais simples.

:smiley: