Como posso gerar números inteiros aleatórios entre duas variáveis especificadas em JavaScript, por exemplo, x = 4
e y = 8
produziria alguma 4, 5, 6, 7, 8
?
javascript
random
integer
zacharyliu
fonte
fonte
Respostas:
Existem alguns exemplos na página Mozilla Developer Network :
Aqui está a lógica por trás disso. É uma regra simples de três:
Math.random()
retorna umNumber
entre 0 (inclusive) e 1 (exclusivo). Portanto, temos um intervalo como este:Agora, gostaríamos de um número entre
min
(inclusive) emax
(exclusivo):Podemos usar o
Math.random
para obter o correspondente no intervalo [min, max). Mas, primeiro, devemos fatorar um pouco o problema subtraindomin
do segundo intervalo:Isto dá:
Agora podemos aplicar
Math.random
e calcular o correspondente. Vamos escolher um número aleatório:Então, para encontrar
x
, faríamos:Não se esqueça de adicionar
min
novamente, para que possamos obter um número no intervalo [min, max):Essa foi a primeira função do MDN. O segundo, retorna um número inteiro entre
min
emax
, inclusive.Agora, para obter números inteiros, você pode usar
round
,ceil
oufloor
.Você pode usar
Math.round(Math.random() * (max - min)) + min
, no entanto, isso fornece uma distribuição não uniforme. Ambosmin
emax
apenas têm aproximadamente metade da chance de rolar:Com
max
excluídos do intervalo, há uma chance ainda menor de rolar do quemin
.Com
Math.floor(Math.random() * (max - min +1)) + min
você tem uma distribuição perfeitamente uniforme.Você não pode usar
ceil()
e-1
nessa equação, porquemax
agora tinha um pouco menos chance de rolo, mas você pode rolar o (indesejada)min-1
resultar também.fonte
floor
, que termina.round
, mas depois os dois,min
emax
só tinha metade da chance de rolar como os outros números. Você também pode subtrair um e pegarceil
. No entanto, isso deixa omax
número com uma chance mínima menor de rolar devido ao[0,1)
intervalo.fonte
(Math.random() * (maximum - minimum + 1) ) << 0
é mais rápido.x << 0
,x | 0
,~~x
) em vez deMath.floor()
convertidosx
em um de dois complemento com alcance muito menor do queNumber.MAX_SAFE_INTEGER
(2³²⁻¹ vs. 2⁵³), assim você tem que usá-lo com cuidado!657348096152|0
receber 218099864 (1100111111111111000010011000 em binário).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 max ( não incluído ):
Exemplos úteis (números inteiros):
** E sempre bom ser lembrado (Mozilla):
fonte
uso:
demolir:
Estamos retornando uma função (emprestada da programação funcional) que, quando chamada, retornará um número inteiro aleatório entre os valores
bottom
etop
, inclusive. Dizemos 'inclusivo' porque queremos incluir tanto a parte inferior como a parte superior no intervalo de números que podem ser retornados. Por aqui,getRandomizer( 1, 6 )
retornará 1, 2, 3, 4, 5 ou 6.(o número inferior é inferior, o número superior é maior)
Math.random()
retorna um duplo aleatório entre 0 e 1, e se o multiplicarmos por um mais a diferença entretop
ebottom
, obteremos um dobro em algum lugar entre0
e1+b-a
.Math.floor
arredonda o número para o número inteiro mais próximo. Portanto, agora temos todos os números inteiros entre0
etop-bottom
. O 1 parece confuso, mas precisa estar lá porque estamos sempre arredondando para baixo, para que o número superior nunca seja realmente alcançado sem ele. O decimal aleatório que geramos precisa estar no intervalo0
para(1+top-bottom)
que possamos arredondar para baixo e obter um int no intervalo0
paratop-bottom
O código no exemplo anterior nos deu um número inteiro no intervalo
0
etop-bottom
, portanto, tudo o que precisamos fazer agora é adicionarbottom
esse resultado para obter um número inteiro no intervalobottom
etop
inclusive. : DNOTA: Se você passar um valor não inteiro ou o número maior primeiro, obterá um comportamento indesejável, mas, a menos que alguém solicite, não vou me aprofundar no código de verificação de argumentos, pois está longe da intenção da pergunta original. .
fonte
Alternativa, se você estiver usando o Underscore.js, poderá usar
fonte
_.uniqueId()
função que você pode chamar de modelos do lado do cliente.x << 0
,x | 0
,~~x
) em vez deMath.floor()
convertidosx
em um de dois complemento com escala muito menor do queNumber.MAX_SAFE_INTEGER
(2³²⁻¹ vs. 2⁵³), assim você tem que usá-lo com cuidado!Retorne um número aleatório entre 1 e 10:
Retorne um número aleatório entre 1 e 100:
fonte
Se você precisar de variável entre 0 e max, poderá usar:
fonte
As outras respostas não respondem pelos parâmetros perfeitamente razoáveis de
0
e1
. Em vez disso, você deve usar oround
invés deceil
oufloor
:fonte
console.log(randomNumber(5,6)); # 9 6 6 5 7 7
números 9 e 7 estão entre 5 e 6? ...... você deve corrigi-lo ou explicar ..Aqui está a classe Implementação aleatória do MS DotNet em javascript-
Usar:
fonte
Use esta função para obter números aleatórios entre o intervalo especificado
fonte
Depois de gerar um número aleatório usando um programa de computador, ainda é considerado um número aleatório se o número escolhido for uma parte ou o número completo do inicial. Mas se foi alterado, os matemáticos não o aceitam como um número aleatório e podem chamá-lo de número tendencioso. Mas se você estiver desenvolvendo um programa para uma tarefa simples, esse não será um caso a ser considerado.Mas se você estiver desenvolvendo um programa para gerar um número aleatório para itens valiosos, como programa de loteria ou jogo de apostas, seu programa será rejeitado pela gerência se você não considerar o caso acima.
Então, para esse tipo de pessoa, aqui está minha sugestão:
Gere um número aleatório usando
Math.random()
. (Diga isson
)Se você sabe ler a tabela de números aleatórios para escolher um número aleatório, o processo acima (multiplicando por 1, 10, 100 e assim por diante) não viola o que eu mencionei no início (porque altera apenas o local do ponto decimal.)
Estude o exemplo a seguir e desenvolva-o de acordo com suas necessidades.
Se você precisar de uma amostra [0,9], o piso de n * 10 é a sua resposta e, se precisar de [0,99], o piso de n * 100 é a sua resposta e assim por diante.
Agora vamos entrar no seu papel:
Você pediu números entre um intervalo específico. (Nesse caso, você é tendencioso nesse intervalo. - Ao pegar um número de [1,6] ao rolar um dado, você é tendencioso para [1,6], mas ainda assim é aleatório se, e somente se, o dado for imparcial .)
Portanto, considere seu intervalo ==> [78, 247] número de elementos do intervalo = 247 - 78 + 1 = 170; (já que os dois limites são inclusivos.
Nota: No método um, primeiro criei uma matriz que contém os números necessários e depois os coloquei aleatoriamente em outra matriz. No método dois, gere números aleatoriamente e verifique se estão no intervalo que você precisa. Em seguida, coloque-o em uma matriz. Aqui eu gerei dois números aleatórios e usei o total deles para maximizar a velocidade do programa, minimizando a taxa de falhas que obtém um número útil. No entanto, a adição de números gerados também fornecerá alguma parcialidade. Então, eu recomendaria meu primeiro método para gerar números aleatórios dentro de um intervalo específico.
Nos dois métodos, seu console mostrará o resultado (pressione f12 no Chrome para abrir o console)
fonte
Math.floor(Math.random() * (6 - 1 + 1) + 1)
] os números 1 e 6 serão necessariamente rolados menos vezes que 2, 3, 4 e 5. No entanto, a diferença é basicamente insignificante.Para um número inteiro aleatório com um intervalo, tente:
fonte
Para testar esta função e variações dessa função, salve o HTML / JavaScript abaixo em um arquivo e abra com um navegador. O código produzirá um gráfico mostrando a distribuição de um milhão de chamadas de função. O código também registrará os casos de borda, portanto, se a função produzir um valor maior que o máximo ou menor que o mínimo, você saberá.
fonte
Para obter um número aleatório, digamos entre 1 e 6, faça primeiro:
Isso multiplica um número aleatório por 6 e adiciona 0,5 a ele. Em seguida, arredonde o número para um número inteiro positivo, fazendo o seguinte:
Arredonda o número para o número inteiro mais próximo.
Ou, para torná-lo mais compreensível, faça o seguinte:
Em geral, o código para fazer isso usando variáveis é:
O motivo para remover 0,5 do valor mínimo é porque o uso do valor mínimo por si só permitiria obter um número inteiro que fosse mais um que o seu valor máximo. Ao retirar 0,5 do valor mínimo, você está essencialmente impedindo que o valor máximo seja arredondado para cima.
Espero que ajude.
fonte
Usando o código a seguir, você pode gerar uma matriz de números aleatórios, sem repetir, em um determinado intervalo.
fonte
Sei que esta pergunta já foi respondida, mas minha resposta pode ajudar alguém.
Encontrei este método simples no W3Schools:
Espero que isso ajude alguém.
fonte
Número inteiro aleatório entre menor e maior:
Não é a solução mais elegante ... mas algo rápido.
fonte
Aqui está o que eu uso para gerar números aleatórios.
Nós executamos
high++
porqueMath.random()
gera um número aleatório entre 0, (inclusive) e 1 (exclusivo). O excluído significa que devemos aumentar o valor em um antes de executar qualquer matemática. Em seguida, subtraímos baixo de alto, dando-nos o número mais alto a ser gerado - baixo, depois + baixo, trazendo alto de volta ao normal e diminuindo o número mais baixo. então retornamos o número resultanterandom(7,3)
poderia retornar3,4,5,6, or 7
fonte
high
é usado apenas uma vez, você também pode usar emhigh-low+1
vez de ter a instrução de incremento separada. Além disso, a maioria dos usuários espera que olow
parâmetro seja o primeiro.O Uint8Array cria uma matriz preenchida com um número de até 3 dígitos, que seria no máximo 999. Esse código é muito curto.
fonte
Aqui está um exemplo de uma função javascript que pode gerar um número aleatório de qualquer tamanho especificado sem usar Math.random ():
fonte
esta é a minha opinião sobre um número aleatório em um intervalo, como em eu queria obter um número aleatório dentro de um intervalo da base ao expoente. por exemplo, base = 10, expoente = 2, fornece um número aleatório de 0 a 100, idealmente, e assim por diante.
se ajudar a usá-lo, aqui está:
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 será sempre 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
Crypto-Strong
Para obter um número inteiro aleatório com criptografia forte em ragne [x, y], tente
fonte
Você pode esse snippet de código,
fonte
do - while
vez dewhile
Ionuț G. Stan escreveu uma ótima resposta, mas era um pouco complexa demais para eu entender. Portanto, encontrei uma explicação ainda mais simples dos mesmos conceitos em https://teamtreehouse.com/community/mathfloor-mathrandom-max-min-1-min-explanation de Jason Anello.
NOTA: A única coisa importante que você deve saber antes de ler a explicação de Jason é uma definição de "truncar". Ele usa esse termo ao descrever
Math.floor()
. O dicionário Oxford define "truncado" como:fonte
Pode lidar com a geração de números aleatórios UNIQUE de até 20 dígitos
JS
JsFiddle
fonte
/ * Escreva uma função chamada
randUpTo
que aceite um número e retorne um número inteiro aleatório entre 0 e esse número? * // * Escreva uma função chamada
randBetween
que aceite dois números representando um intervalo e retorne um número inteiro aleatório entre esses dois números. * // * Escreva uma função chamada
randFromTill
que aceite dois números representando um intervalo e retorne um número aleatório entre min (inclusive) e max (exclusivo). * // * Escreva uma função chamada
randFromTo
que aceite dois números representando um intervalo e retorne um número inteiro aleatório entre min (inclusive) e max (inclusive) * /fonte
Eu criei essa função que leva em conta opções como min, max, excluir (uma lista de entradas a serem excluídas) e semente (caso você queira um gerador aleatório semeado).
Pode ser usado como:
Ou, mais simplesmente:
Então você pode fazer:
Gist: https://gist.github.com/madprops/757deb000bdec25776d5036dae58ee6e
fonte
Math.floor arredonda um número para o número inteiro mais próximo
Portanto, para gerar um número inteiro aleatório entre 4 e 8, inclusive, chame a função acima com os seguintes argumentos:
fonte
Meu método de gerar número aleatório entre 0 e n, em que n <= 10 (n excluído):
fonte