0
respostas

Uma outra forma de calcular números aleatórios de 1 a 10.

Bem, eu já tive contato com lógica de programação antes de fazer esse curso e, também, sempre fui fã de matemática. Ao observar o algoritmo, senti que, para esse caso específico - criar uma lista com x números aleatórios entre 1 e 10 diferentes entre si - o programa pode acabar realizando bastantes cálculos. Por mais improvável que seja, ainda há uma chance razoável de serem sorteados, em sequência, vários números que já estejam na lista por conta do tamanho do intervalo considerado nessa questão. Isso significa que, quanto menor o intervalo considerado, maior será a variação da quantidade de cálculos realizados em cada execução do código e, consequentemente, no seu tempo de execução. Por esse motivo, eu gostaria de propor um outro algoritmo. A ideia por trás dele é muito simples: imagine que eu possuo 10 bolas numeradas e uma urna. Eu posso colocá-las uma a uma, em ordem crescente, dentro da urna e depois chacoalhá-la, retirando as bolas novamente e tomando o valor das 3 primeiras para serem os meus segredos escolhidos. Como as bolas não se repetem, apenas com uma chacoalhada na caixa, eu consigo gerar uma sequência de números aleatórios e distintos. No JavaScript, nós não temos uma função que "embaralhar" os elementos de uma lista/array. Desse modo, precisamos utilizar um algoritmo conhecido como Fisher-Yates.

<meta charset="UTF-8">

<input/>
<button>Compare com o meu segredo</button>

<script>

    function chacoalhaUrna(urna) {

    // The Fisher-Yates algorith

    for ( var i = urna.length - 1 ; i > 0; i = i - 1) {

        var j = Math.floor( Math.random() * ( i + 1 ));

        [urna[i], urna[j]] = [urna[j], urna[i]];

        /* É o mesmo que fazer:

        var temporaria = urna [ i ];
        urna [ i ] = urna [ j ];
        urna [ j ] = temporaria;

        */

        }
    return urna;
    }

    /*
    function sorteiaNumeros(quantidade) {

        var segredos = [];

        var numero = 1;

        while(numero <= quantidade) {

            var numeroAleatorio = sorteia();
            var achou = false;

            if (numeroAleatorio !== 0) {
                for(var posicao = 0; posicao < segredos.length; posicao++) {

                    if(segredos[posicao] == numeroAleatorio){
                        achou = true;
                        break;
                    }
                }

                if (achou == false) {
                    segredos.push(numeroAleatorio);
                    numero++;
                }
            }
            return segredos;
        }
    */

    var quantidadeDeBolas = 10;
    var urna = [ ];
    for(var i = 1; i <= quantidadeDeBolas; i++){
        urna.push(i);
    }

    var quantidadeDeChacoalhadas = 1;
    for( var i = 0; i < quantidadeDeChacoalhadas; i++){
        urna = chacoalhaUrna(urna);
        console.log(urna);
    }    

    var quantidadeDeSegredos = 4;
    var segredos = urna.slice(0,quantidadeDeSegredos);

    console.log(segredos);

    var input = document.querySelector("input");
    input.focus();

    function verifica() {

        var acertou = false;

        for(var posicao = 0; posicao < segredos.length; posicao++) {

            if(input.value == segredos[posicao]) {
                acertou = true;
                break;
            } 
        }
        if(acertou) {
            alert("Você ACERTOU!");
        } else {
            alert("Você ERROU!");
        }
        input.value = "";
        input.focus();
    }

    var button = document.querySelector("button");

    button.onclick = verifica;

</script>

Nosso programa tem agora não só uma estabilidade em tempo de execução, como também, um ganho de velocidade!