9 de julho de 2019

Loterias

Vamos ver o funcionamento da função random() sorteando números da loteria.
O projeto utiliza a função random() para sortear números de acordo com cada tipo de loteria.

MEGA-SENA:
São sorteados 6 números entre 1 e 60.

DUPLA SENA:
São sorteados 6 números entre 1 e 60.

QUINA:
São sorteados 5 números entre 1 e 80.

LOTOFÁCIL:
São sorteados 15 números entre 1 e 25.

LOTOMANIA:
São sorteados 50 números entre 0 e 99.

A lógica do programa é gerar quantos números aleatórios forem necessários para cada loteria, entre o mínimo e o máximo, verificando se o número ainda não foi sorteado.

Os valores são exibidos através da comunicação serial:


A função random() é muito útil e pode ser utilizada em diversas situações.

Sintaxe:
random(valorMáximo);
ou
random(valorMínimo, valorMáximo);

O valor mínimo é opcional e, quando não declarado é considerado o valor 0.
O valor máximo é exclusivo, sendo considerado valorMáximo - 1.

Exemplos:
int x = random(10);    //x receberá um valor de 0 a 9.
int y = random(2, 10); //y receberá um valor de 2 a 9.

Para ver todos os projetos com a função, use a busca pelo marcador Random.

Referências:
http://www.loterias.caixa.gov.br/
https://www.arduino.cc/reference/pt/language/functions/random-numbers/random/
https://www.arduino.cc/reference/pt/language/functions/random-numbers/randomseed/

Segue o código fonte:

/*---------------------------------------------------------
  Programa : LOTERIAS (SORTEIO)
  Autor    : Fellipe Couto [ http://www.efeitonerd.com.br ]
  Data     : 09/07/2019
  ---------------------------------------------------------*/
#define MEGASENA_MIN 1
#define MEGASENA_MAX 60
#define MEGASENA_QTD 6
#define DUPLASENA_MIN 1
#define DUPLASENA_MAX 50
#define DUPLASENA_QTD 6
#define LOTOFACIL_MIN 1
#define LOTOFACIL_MAX 25
#define LOTOFACIL_QTD 15
#define QUINA_MIN 1
#define QUINA_MAX 80
#define QUINA_QTD 5
#define LOTOMANIA_MIN 0
#define LOTOMANIA_MAX 99
#define LOTOMANIA_QTD 50
#define QTD_MAX 50

int numbers[QTD_MAX];

void setup() {
  //Inicia a serial
  Serial.begin(9600);
  delay(1000);
  
  //Efetua os sorteios
  Serial.println("\n\n\n\tLOTOFACIL\nSorteados:");
  Lottery(LOTOFACIL_MIN, LOTOFACIL_MAX, LOTOFACIL_QTD);
  ShowNumbers(LOTOFACIL_QTD);

  Serial.println("\n\n\n\tMEGA-SENA\nSorteados:");
  Lottery(MEGASENA_MIN, MEGASENA_MAX, MEGASENA_QTD);
  ShowNumbers(MEGASENA_QTD);

  Serial.println("\n\n\n\tDUPLA-SENA\nSorteados:");
  Lottery(DUPLASENA_MIN, DUPLASENA_MAX, DUPLASENA_QTD);
  ShowNumbers(DUPLASENA_QTD);

  Serial.println("\n\n\n\tQUINA\nSorteados:");
  Lottery(QUINA_MIN, QUINA_MAX, QUINA_QTD);
  ShowNumbers(QUINA_QTD);

  Serial.println("\n\n\n\tLOTOMANIA\nSorteados:");
  Lottery(LOTOMANIA_MIN, LOTOMANIA_MAX, LOTOMANIA_QTD);
  ShowNumbers(LOTOMANIA_QTD);
}

void loop() {}

void Lottery(int numMin, int numMax, int qtdNum) {
  //Limpa o array
  for (int i = 0; i < QTD_MAX; i++) {
    numbers[i] = 0;
  }

  //Para o random não repetir sequencias
  randomSeed(analogRead(0) + millis());

  //Loop para sortear a quantidade de números (qtdNum)
  for (int rdm = 0; rdm < qtdNum; rdm++) {
    bool newNumber = false;

    //Loop enquanto a variável estiver em false
    while (newNumber == false) {

      //Efetua o sorteio de um numero de 1 a numMax
      int numLottery = random(numMin, numMax + 1);

      //Verifica em todas as posições do array se já existe o número
      bool numIncluded = false;
      for (int i = 0; i < 15; i++) {
        if (numbers[i] == numLottery) {
          numIncluded = true;
          break; //Finaliza o loop caso o número já exista no array
        }
      }

      //O número ainda não foi sorteado
      if (numIncluded == false) {
        newNumber = true; //Seta a variável para sair do loop
        numbers[rdm] = numLottery; //Atribui o número sorteado a posição do array
      }
    }
  }
}

void ShowNumbers(int qtdNum) {
  for (int i = 0; i < qtdNum; i++) {
    Serial.print(numbers[i]);
    Serial.print("  ");
    if (i == 24)Serial.println();
    delay(100);
  }
}

Nenhum comentário:

Postar um comentário