Existe uma maneira de gerar um número aleatório em um intervalo especificado (por exemplo, de 1 a 6: 1, 2, 3, 4, 5 ou 6) em JavaScript?
javascript
random
Mirgorod
fonte
fonte
Math.floor((Math.random()*10)+1);
não pode funcionar para você, conforme especificado aqui em w3schools.com/jsref/jsref_random.asp ..?Respostas:
Importante
O código a seguir funciona apenas se o valor mínimo é
1
. Não funciona para valores mínimos diferentes de1
.Se você deseja obter um número inteiro aleatório entre 1 ( e apenas 1 ) e 6, calcula:
Onde:
fonte
Math.floor(Math.random() * 6) + 2
meios que, seMath.random()
os resultados em 0.99 nosso valor aleatório seria7
O que ele faz "extra" é que permite intervalos aleatórios que não começam com 1. Portanto, você pode obter um número aleatório de 10 a 15, por exemplo. Flexibilidade.
fonte
to
argumento, ofrom
argumento também é o máximo.Returns a floating-point, pseudo-random number in the range [0, 1) that is, from 0 (inclusive) up to but not including 1 (exclusive), which you can then scale to your desired range.
( developer.mozilla.org/en-US/docs/JavaScript/Reference/… )Math.random ()
Retorna um número aleatório inteiro entre min ( incluído ) e max ( incluído ):
Ou qualquer número aleatório entre min ( incluído ) e máximo ( não incluído ):
Exemplos úteis (números inteiros):
** E sempre bom ser lembrado (Mozilla):
fonte
[1,2]
, há 25% de chanceMath.random()
iria dar-lhe um número de um deles[0,0.49]
,[0.5,0.99]
,[1,1.49]
,[1.5,1.99]
. Arredondar esses intervalos resultaria em 0, 1, 1, 2, que não é uma distribuição uniforme. Piso lhes resulta em 0, 0, 1, 1.Math.round
excessivoMath.floor
daria resultados diferentes.function getRandomInt(min, max) { return Math.round((min - 0.5) + Math.random() * (max - min + 1)); }
Outras soluções:
(Math.random() * 6 | 0) + 1
~~(Math.random() * 6) + 1
Experimente on-line
fonte
~~a
e Bitwise OR (a | 0) são mais rápidas maneiras de escrever Math.floor (a)a | 0
também é a maneira mais rápida e otimizada de converter uma string em um número inteiro. Ele funciona apenas com strings contendo números inteiros ("444"
e"-444"
), ou seja, sem flutuações / frações. Produz um0
para tudo que falha. É uma das principais otimizações por trás do asm.js.~~(Math.random() * (50000000000000 - 0 + 1)) + 0
eMath.floor(Math.random() * (50000000000000 - 0 + 1)) + 0
TL; DR
Para obter o número aleatório
generateRandomInteger(-20, 20);
EXPLICAÇÃO ABAIXO
Precisamos obter um número inteiro aleatório, digamos X entre min e max.
Direita?
ie min <= X <= max
Se subtrairmos min da equação, isso é equivalente a
0 <= (X - min) <= (max - min)
Agora, vamos multiplicar isso com um número aleatório r que é
0 <= (X - min) * r <= (max - min) * r
Agora, vamos adicionar de volta min à equação
min <= min + (X - min) * r <= min + (max - min) * r
Agora, vamos escolher uma função que resulte em r tal que satisfaça nosso intervalo de equações como [min, max]. Isso só é possível se 0 <= r <= 1
ESTÁ BEM. Agora, o intervalo de r, ou seja, [0,1] é muito semelhante ao resultado da função Math.random (). Não é?
Por exemplo,
Caso r = 0
min
+ 0 * (max
-min
) = minCaso r = 1
min
+ 1 * (max
-min
) = máx.Caso aleatório usando Math.random 0 <= r <1
min
+ r * (max
-min
) = X , em que X tem um intervalo de min <= X < maxO resultado acima X é um numérico aleatório. No entanto, devido a Math.random (), nosso limite esquerdo é inclusivo e o limite direito é exclusivo. Para incluir nosso limite direito, aumentamos o limite direito em 1 e calculamos o resultado.
Para obter o número aleatório
generateRandomInteger(-20, 20)
;fonte
Ou, em sublinhado
fonte
fonte
jsfiddle: https://jsfiddle.net/cyGwf/477/
Número inteiro aleatório : para obter um número inteiro aleatório entre
min
emax
, use o seguinte códigoNúmero de ponto flutuante aleatório : para obter um número de ponto flutuante aleatório entre
min
emax
, use o seguinte códigoReferência: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random
fonte
A matemática não é o meu ponto forte, mas tenho trabalhado em um projeto em que precisava gerar muitos números aleatórios entre positivos e negativos.
Por exemplo
Obviamente, você também pode adicionar alguma validação para garantir que não faça isso com nada além de números. Verifique também se min é sempre menor ou igual ao máximo.
fonte
min + Math.random() * max
fornecerá números entre min e min + max, o que não é o que você deseja. O primeiro ramo doif
está correto, mas poderia ser simplificado para dizerreturn min + Math.random() * (max - min)
, qual é a solução correta, independentemente de min ser positivo ou negativo (veja as outras respostas). Além disso, lembre-se de que você ainda precisa calcular o resultado se não quiser frações.Eu escrevi uma função mais flexível, que pode fornecer um número aleatório, mas não apenas um número inteiro.
Versão fixa.
fonte
Exemplo
Retorne um número aleatório entre 1 e 10:
O resultado pode ser:
3
Experimente você mesmo: aqui
-
ou usando lodash / undescore:
_.random(min, max)
Documentos: - lodash - undescore
fonte
Apesar de muitas respostas e quase o mesmo resultado. Gostaria de adicionar minha resposta e explicar seu funcionamento. Porque é importante entender o seu funcionamento em vez de copiar e colar um código de linha. Gerar números aleatórios não passa de matemática simples.
CÓDIGO:
fonte
Eu estava pesquisando um gerador de números aleatórios escrito em TypeScript e escrevi isso depois de ler todas as respostas, espero que funcione para codificadores TypeScript.
fonte
Math.random()
é rápido e adequado para muitos propósitos, mas não é apropriado se você precisar de valores criptograficamente seguros (não é seguro) ou se precisar de números inteiros de uma distribuição imparcial completamente uniforme (a abordagem de multiplicação usada em outras respostas produz determinados valores com uma frequência um pouco mais frequente do que outros).Nesses casos, podemos usar
crypto.getRandomValues()
para gerar números inteiros seguros e rejeitar quaisquer valores gerados que não possamos mapear uniformemente no intervalo de destino. Isso será mais lento, mas não deve ser significativo, a menos que você esteja gerando um número extremamente grande de valores.Para esclarecer a questão da distribuição tendenciosa, considere o caso em que queremos gerar um valor entre 1 e 5, mas temos um gerador de números aleatórios que produz valores entre 1 e 16 (um valor de 4 bits). Queremos ter o mesmo número de valores gerados mapeados para cada valor de saída, mas 16 não se divide uniformemente por 5: deixa um restante de 1. Portanto, precisamos rejeitar 1 dos possíveis valores gerados e continuar apenas quando obtivermos um dos 15 valores menores que podem ser mapeados uniformemente em nosso intervalo de segmentação. Nosso comportamento pode se parecer com este pseudocódigo:
O código a seguir usa lógica semelhante, mas gera um número inteiro de 32 bits, porque esse é o maior tamanho inteiro comum que pode ser representado pelo
number
tipo padrão do JavaScript . (Isso pode ser modificado para usarBigInt
s, se você precisar de um intervalo maior.) Independentemente do intervalo escolhido, a fração dos valores gerados que são rejeitados sempre será menor que 0,5, portanto, o número esperado de rejeições sempre será menor que 1,0 e geralmente perto de 0,0; você não precisa se preocupar com isso para sempre.fonte
Adicionando
float
com versão de precisão fixa com base naint
versão na resposta do @ Francisc:tão:
e para resposta int
fonte
Número inteiro aleatório cripto-forte no intervalo [a, b] (suposição: a <b)
fonte
Isso deve funcionar:
fonte
Eu descobri uma ótima maneira nova de fazer isso usando os parâmetros padrão do ES6. É muito bacana, pois permite um ou dois argumentos. Aqui está:
fonte
Isso está com cerca de nove anos de atraso, mas o randojs.com torna isso uma linha simples:
Você só precisa adicionar isso ao cabeçalho do seu documento html e pode fazer o que quiser com aleatoriedade facilmente. Valores aleatórios de matrizes, elementos jquery aleatórios, propriedades aleatórias de objetos e até mesmo impedir repetições, se necessário.
fonte
Isso funciona para mim e produz valores como a função de biblioteca padrão random.randint do Python :
fonte
Tente usar:
fonte
retornar 1-6 como um dado basicamente,
fonte