Dúvida sobre math.random
3 participantes
Fórum dos Fóruns :: Ajuda e atendimento ao utilizador :: Questões sobre códigos :: Questões resolvidas sobre códigos Javascript e jQuery
Página 1 de 1 • Compartilhe
Dúvida sobre math.random
Detalhes da questão
Endereço do fórum: https://somosmugiwara.forumeiros.com/
Versão do fórum: ModernBB
Descrição
Estou criando um código que mostra um campo de perfil no índice do fórum, funciona da seguinte forma. Existe um campo no perfil chamado status de cada membro, onde cada um pode escrever o que quiser. O código abaixo pega os membros online atualmente no fórum e escolhe aleatoriamente um dos online para mostrar as informações, neste caso o campo de perfil do status.
O código já é totalmente funcional, mas me deparei com um problema com o math.random. Neste caso o length dos membros online é um, mas o math.random escolha de forma aleatória entre 0 e 1. Quando o resultado é 0, retorna o membro online, visto que o primeiro é [0]. Mas quando retorna o 1, ocorre um problema de undefinid, pois existe apenas um membro online no momento.
Pensei na seguinte soluçõe, adicionar o resultado do math.random -1 e posteriormente criando uma condicional de menor que 0 retorna o resultado 0 para a variável e igual ou maior que zero retorna a variável do math.random.
A minha dúvida é se existiria uma outra solução e se a minha solução seria viável de acontecer.
- Código:
$(window).load(function() {
var useon = $('.usiconect').find("a").map(
function(){
return $(this).attr("href");
}).get();
var usersort = useon[(Math.round(Math.random() * useon.length)) - 1];
$.ajax({
url: usersort,
type: 'GET',
success: function(responseHtml)
{
var usiname = $('.lighter a.userostatus', responseHtml).text();
var usistatus = $('#profile_field_13_-8', responseHtml).val();
$('.mystatus').html('<span class="namest">'+ usiname + '</span><span class="descst">' + usistatus + '</span>');
},
error: function(err)
{
console.log("AJAX error in request");
}
});
});
edit: achei uma solução boa, substituir o primeiro math.random por math.floor
Re: Dúvida sobre math.random
O método mais aceito para sortear um elemento de array pseudo-aleatoriamente em JavaScript é este:
Note que é pura matemática. Ao multiplicarmos o resultado de `random` por `arr.length`, estamos ampliando o intervalo de números possíveis (como você sabe, `random` sempre gera um número racional entre 0 e 1).
No entanto, precisamos de arredondar o valor retornado para baixo (já que só queremos a parte inteira do valor obtido). Para realizar esse arredondamento, utiliza-se a função `floor`.
O problema no seu código está acontecendo porque você não está arredondando para baixo, mas sim para o inteiro mais próximo, o que dará erro, uma vez que elementos do array são indexáveis a partir do zero. Eventualmente, caso o arredondamento seja feito para cima (o que pode acontecer no caso de se utilizar `round` ao invés de `floor`), pode-se tentar acessar um elemento a partir de um índice uma unidade maior que o índice do último elemento.
Pelo código, parece que você pensou que subtrair o resultado de `round` por -1 resolveria o problema. No entanto, isso só "inverte" o problema, de modo que, ao invés de acontecer no "limite de cima", ocorre no "limite de baixo". Imagine que o índice sorteado seja zero (correspondente ao primeiro elemento do array). Ao subtraí-lo por 1, obteríamos -1, o que jamais será indexável em um array normal.
Veja mais na documentação:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor
Talvez seja interessante aprofundar o entendimento em arrays:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array
E sobre perguntas específicas de JavaScript, sugiro utilizar o Stack Overflow em Português, já que esse tipo de pergunta nada tem a ver com Forumeiros.
- Código:
const arr = [1, 2, 3];
const randomElement = Math.floor(Math.random() * arr.length);
Note que é pura matemática. Ao multiplicarmos o resultado de `random` por `arr.length`, estamos ampliando o intervalo de números possíveis (como você sabe, `random` sempre gera um número racional entre 0 e 1).
No entanto, precisamos de arredondar o valor retornado para baixo (já que só queremos a parte inteira do valor obtido). Para realizar esse arredondamento, utiliza-se a função `floor`.
O problema no seu código está acontecendo porque você não está arredondando para baixo, mas sim para o inteiro mais próximo, o que dará erro, uma vez que elementos do array são indexáveis a partir do zero. Eventualmente, caso o arredondamento seja feito para cima (o que pode acontecer no caso de se utilizar `round` ao invés de `floor`), pode-se tentar acessar um elemento a partir de um índice uma unidade maior que o índice do último elemento.
Pelo código, parece que você pensou que subtrair o resultado de `round` por -1 resolveria o problema. No entanto, isso só "inverte" o problema, de modo que, ao invés de acontecer no "limite de cima", ocorre no "limite de baixo". Imagine que o índice sorteado seja zero (correspondente ao primeiro elemento do array). Ao subtraí-lo por 1, obteríamos -1, o que jamais será indexável em um array normal.
Veja mais na documentação:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor
Talvez seja interessante aprofundar o entendimento em arrays:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array
E sobre perguntas específicas de JavaScript, sugiro utilizar o Stack Overflow em Português, já que esse tipo de pergunta nada tem a ver com Forumeiros.
Re: Dúvida sobre math.random
Sim isso mesmo estava acontecendo, depois pesquisei melhor na documentação e encontrei a própria sugestão que você deu. Thanks.
Re: Dúvida sobre math.random
Tópico resolvidoMovido para "Questões resolvidas". |
tikky- Admineiro
- Membro desde : 13/01/2017
Mensagens : 7972
Pontos : 9236
Tópicos semelhantes
» Dúvida sobre a CGU
» Como adicionar imagem antes do nome dos grupos?
» Dúvida sobre as fichas
» Duvida sobre o facebook
» [Dúvida] Sobre domínio
» Como adicionar imagem antes do nome dos grupos?
» Dúvida sobre as fichas
» Duvida sobre o facebook
» [Dúvida] Sobre domínio
Fórum dos Fóruns :: Ajuda e atendimento ao utilizador :: Questões sobre códigos :: Questões resolvidas sobre códigos Javascript e jQuery
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos