Ir ao conteúdo
  • Cadastre-se

C++ Gerar números randomicos em C++


Insurgent3

Posts recomendados

Olá pessoal,

 

Tenho um jogo de tabuleiro com 530 territórios. 


- Quero sortear 3 números de 1 à 530 pra ser as bases do jogador (base 1, base 2 e base 3).

- Quero sortear 3 números de 1 à 530 pra ser o objetivo do jogador (Objetivo 1, Objetivo 2 e Objetivo 3).


Acontece que os números que estou gerando de 1 à 530 estão todos iguais. Preciso de números verdadeiramente aleatórios.

 

Olha a imagem com o resultado:

 

https://i.ibb.co/H23w4bd/image.png

 

Código:

 

/* srand example */
#include <stdio.h>      /* printf, NULL */
#include <stdlib.h>     /* srand, rand */
#include <time.h>       /* time */

int main ()
{
   
   /* initialize random seed: */
   srand (time(NULL));
   printf ("Base 1: %d\n", rand()%530 + 1);  // Base número 1
   
   /* initialize random seed: */
   srand (time(NULL));
   printf ("Base 2: %d\n", rand()%530 + 1);  // Base número 2
   
   /* initialize random seed: */
   srand (time(NULL));
   printf ("Base 3: %d\n", rand()%530 + 1);  // Base número 3
   
   /* initialize random seed: */
   srand (time(NULL));
   printf ("Objetivo 1: %d\n", rand()%530 + 1);  // Objetivo número 1

   
   /* initialize random seed: */
   srand (time(NULL));
   printf ("Objetivo 2: %d\n", rand()%530 + 1);  // Objetivo número 2
   
   /* initialize random seed: */
   srand (time(NULL));
   printf ("Objetivo 3: %d\n", rand()%530 + 1);  // Objetivo número 3
   
  return 0;
}


Alguém pode ajudar sobre como fazer os números serem sorteados de 1 à 530?

 

Obrigado.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Eu geralmente faço dessa maneira

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


/* Constantes */
#define Q_NUMEROS 10


void Troca(int *f, int *d);

int main(void)
{
  int vet[Q_NUMEROS],cont,indice;
  /* Inicia o vetor */
  for(cont=0; cont<Q_NUMEROS; cont++)
    vet[cont]=cont+1;
  printf("\nMostra os numeros na ordem correta.");
  /* Mostra os numeros */
  for(cont=0; cont<Q_NUMEROS; cont++)
    printf("\n%i",vet[cont]);
  printf("\nPressione enter para continuar....\n");
  getchar();    /* Pausa */
  printf("\nMostra os numeros em ordem aletoria.");
  /* Você já deve saber pra que isso server! */
  srand(time(NULL));
  /* Gera os numeros aleatorios */
  for(cont=0; cont<Q_NUMEROS; cont++)
  {
    indice=rand()%Q_NUMEROS;
    Troca(&vet[cont],&vet[indice]);
  }
  /* Mostra os numeros */
  for(cont=0; cont<Q_NUMEROS; cont++)
    printf("\n%i",vet[cont]);
  printf("\nPressione enter para continuar....\n");
  getchar();    /* Pausa */
  return(0);
}

void Troca(int *f, int *d)
{
  int temp;
  temp=*d;
  *d=*f;
  *f=temp;
}

Gerar números aleatórios em tempo real geralmente não dá muito certo.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@KXSY

 

Grato pela ajuda. Mas ainda não consegui resolver meu código. Eu compilei e rodei seu código mas não consegui resolver meu problema ainda....Preciso gerar 6 numeros apenas entre 1 e 530. Qualquer ajuda é bem vinda!

 


Obrigado.

 

 

-- Edit --

 

Eu optei por utilizar, já que achei como opção, usar um site online pra gerar os números randomicos de 1 à 530.

 

O problema é que se eu estiver sem internet não conseguirei jogar...hehe! 

 

Se alguém souber uma solução ainda eu agradeço. Trabalhei no código do @KXSY mas não consegui imprimir 6 números. Esta imprimindo 1 número apenas. Enfim, vou usar a versão online.

 

Agradecido!

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

8 minutos atrás, Insurgent3 disse:

Grato pela ajuda. Mas ainda não consegui resolver meu código. Eu compilei e rodei seu código mas não consegui resolver meu problema ainda....Preciso gerar 6 numeros apenas entre 1 e 530. Qualquer ajuda é bem vinda!

você basicamente iria fazer igual ao meu código ai em cima (com uma pequena modificação para aceitar 530 números), é depois pegar 6 números do vetor.

 

Exemplo

Spoiler

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


/* Constantes */
#define Q_NUMEROS 530


void Troca(int *f, int *d);

int main(void)
{
  int vet[Q_NUMEROS],cont,indice;
  /* Inicia o vetor */
  for(cont=0; cont<Q_NUMEROS; cont++)
    vet[cont]=cont+1;
  printf("\nMostra os numeros na ordem correta.");
  /* Mostra os numeros */
  for(cont=0; cont<Q_NUMEROS; cont++)
    printf("\n%i",vet[cont]);
  printf("\nPressione enter para continuar....\n");
  getchar();    /* Pausa */
  /* Você já deve saber pra que isso server! */
  srand(time(NULL));
  /* Gera os numeros aleatorios */
  for(cont=0; cont<Q_NUMEROS; cont++)
  {
    indice=rand()%Q_NUMEROS;
    Troca(&vet[cont],&vet[indice]);
  }
  /* Mostra os numeros */
  printf("\nSeus 6 numeros.");
  for(cont=0; cont<6; cont++)
    printf("\n%i",vet[cont]);
  printf("\nPressione enter para continuar....\n");
  getchar();    /* Pausa */
  return(0);
}

void Troca(int *f, int *d)
{
  int temp;
  temp=*d;
  *d=*f;
  *f=temp;
}

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

16 minutos atrás, Insurgent3 disse:

@KXSY

 

Grato pela ajuda. Mas ainda não consegui resolver meu código. Eu compilei e rodei seu código mas não consegui resolver meu problema ainda....Preciso gerar 6 numeros apenas entre 1 e 530. Qualquer ajuda é bem vinda!

 


Obrigado.

 

Você provavelmente não leu com cuidado a documentação de rand()/srand()... Quando você chama isso --- srand() --- com um certo valor a sequência é reiniciada. Isso se chama seeding, de semear. Como você chama srand() de novo com o mesmo valor fica tudo igualzinho de novo ;) 


Veja a saída

Vai usar srand(time(NULL) para iniciar a sequencia!...
rand() 9
rand() 4
rand() 3
rand() 1
rand() 5
rand() 4
rand() 10
rand() 3
rand() 10
Vai usar o mesmo srand() para iniciar a sequencia...
EntÒo vai gerar a mesma sequencia!...
rand() 9
rand() 4
rand() 3
rand() 1
rand() 5
rand() 4
rand() 10
rand() 3
rand() 10

para o programa 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "time.h"
int main(int argc, char* argv)
{
    printf("Vai usar srand(time(NULL) para iniciar a sequencia!...\n");
    srand(time(NULL));
    for (int i = 0; i < 9; i += 1)
        printf("rand()%10 %d\n", rand() % 10 + 1);
    printf("Vai usar o mesmo srand() para iniciar a sequencia...\n");
    printf("Então vai gerar a mesma sequencia!...\n");
    srand(time(NULL));
    for (int i = 0; i < 9; i += 1)
        printf("rand()%10 %d\n", rand() % 10 + 1);
    return 0;
};  // main()

Agora se você mudar...

    printf("srand(2002021355) para iniciar a sequencia!...\n");
    srand(2002021355);
    for (int i = 0; i < 9; i += 1)
        printf("rand()%%10 %d\n", rand() % 10 + 1);
    printf("Continua usando rand() para a nova sequencia...\n");
    for (int i = 0; i < 9; i += 1)
        printf("rand()%%10 %d\n", rand() % 10 + 1);
    return 0;

vai ver 

srand(2002021355) para iniciar a sequencia!...
rand()%10 3
rand()%10 7
rand()%10 4
rand()%10 6
rand()%10 5
rand()%10 4
rand()%10 2
rand()%10 9
rand()%10 6
Continua usando rand() para a nova sequencia...
rand()%10 2
rand()%10 6
rand()%10 8
rand()%10 6
rand()%10 6
rand()%10 8
rand()%10 7
rand()%10 3
rand()%10 5

 

24 minutos atrás, KXSY disse:

Gerar números aleatórios em tempo real geralmente não dá muito certo

 

Que significa? Qual seria o problema em geral?

adicionado 2 minutos depois

As vezes você quer exatamente isso: poder reproduzir uma sequência "aleatória" para novos testes. Mas em muitos casos não é o que você quer. Então você chama srand() de acordo com sua intenção. Qualquer integer serve como parâmetro. 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

55 minutos atrás, arfneto disse:

Que significa? Qual seria o problema em geral?

Em jogos os números não podem ser tão aleatórios assim, fora que não poderia repetir o numero que já foi gerado.

 

Exemplo

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


/* Constantes */
#define MAX_NUMEROS 100

void Troca(int *f, int *d);

int main(void)
{
  int vet[MAX_NUMEROS],cont,indice,pontos;
  /* Inicia o vetor */
  for(cont=0; cont<MAX_NUMEROS; cont++)
    vet[cont]=cont+1;
  srand(time(NULL));
  /* Desordena o vetor */
  for(cont=0; cont<MAX_NUMEROS; cont++)
  {
    indice=rand()%MAX_NUMEROS;
    Troca(&vet[cont],&vet[indice]);
  }
  pontos=cont=0;
  do
  {
    int n;
    printf("\nAdivinhe o numero de 1 a 100\nDigite a sua tentativa:\t");
    scanf("%i%*c",&n);
    if(n==vet[cont])
    {
      printf("\nVoce acertou!");
      pontos++;
    }
    else
      printf("\nVoce errou!");
    printf("\nO numero era:%i",vet[cont]);
    cont++;
    printf("\nNumeros que voce nao pode tentar mais.");
    for(indice=0; indice<cont; indice++)
      printf("\n%i",vet[indice]);
  }while(cont<MAX_NUMEROS);
  printf("\nTotal de acertos:%i",pontos);
  getchar();
  return(0);
}

void Troca(int *f, int *d)
{
  int temp;
  temp=*d;
  *d=*f;
  *f=temp;
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, KXSY disse:

Em jogos os números não podem ser tão aleatórios assim, fora que não poderia repetir o numero que já foi gerado

 

Isso vai depender do jogo e da situação. Se estiver simulando movimento, partículas ou coisas assim não há qualquer problema em repetir números e por outro lado você pode criar problemas ao evitar a repetição. Imagine por exemplo vento, fogo, inimigos...
 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

37 minutos atrás, arfneto disse:

Isso vai depender do jogo e da situação. Se estiver simulando movimento, partículas ou coisas assim não há qualquer problema em repetir números e por outro lado você pode criar problemas ao evitar a repetição. Imagine por exemplo vento, fogo, inimigos...

sim realmente. mas eu estava me referindo a habilidade de escolha (como no exemplo dos números), como no caso do pokémon do game boy em que os inimigos são todos os mesmo dependendo de onde você está.

 

Não há aleatoriedade nesse caso porque os números são todos gerados em tempo real muitas vezes repetindo o mesmo, fazendo o jogo se tornar repetitivo.

 

O único cenário que eu acho isso interessante é em jogos 3D, mas muitos efeitos geralmente são pre-gerados como o fogo.

palito.png.3e3f018d40c2c2fb94a850fb3b2924aa.png

(Foi feito no blender com o fogo pre carregado)

Não há necessidade de utilizar partículas basicamente porque isso tomaria tempo da CPU, sendo melhor reproduzir um padrão pre gerado.

 

Outros jogos 2D também fazem o mesmo como em verytex

https://youtu.be/L7FvNbS5MgY

Onde no jogo é basicamente um bitmap (o fogo) com cálculos de seno para dar um efeito de movimento.

 

Ou como em doom que basicamente é um shift palette.

Eu achei um tutorial de como fazer o fogo do Doom, era para assembly mas serve para qualquer outra biblioteca 2d.

Spoiler

Rotinas de Fogo

Para demonstrar como escrever um programa assembly, vamos escrever uma
rotina de fogo em assembly 100%. A teoria é simples...

Sete a paleta para ir de branco para amarelo para vermelho para azul
para preto.
Crie um array 2D representando a tela do computador.
Coloque valores altos no fundo do array (tela)
Para cada elemento, faça o seguinte:
  Calcule a média dos quatro elementos abaixo dele

            * Elemento atual
               123
            4 Outros elementos

  Pegue a média dos quatro elementos e coloque o resultado no elemento atual.
Repetir

Fácil, né? A primeira vez que vi uma rotina de fogo foi no demo Iguana, e eu
tinha que fazer uma ;) ... ela parece bem efetiva.

foi feito pelo DENTHOR do ASPHYXIA para o VGA-training.

 

Mas realmente não se pode generalizar.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Poderia tentar assim:

#include <iostream>
#include <climits>

bool existe(int valor, int valores[], int tamanho);

int main() {
    const int tamanho = 6;
    int valores[tamanho] = {INT_MIN, INT_MIN, INT_MIN, INT_MIN, INT_MIN, INT_MIN};

    int base1 = INT_MIN;
    int base2 = INT_MIN;
    int base3 = INT_MIN;
    int objetivo1 = INT_MIN;
    int objetivo2 = INT_MIN;
    int objetivo3 = INT_MIN;

    srand((unsigned) time(nullptr));

    for (int i = 0; i < tamanho; ++i) {
        int valor = INT_MIN;

        do {
            valor = rand() % 530 + 1;
        } while (existe(valor, valores, tamanho));

        valores[i] = valor;
    }

    base1 = valores[0];
    base2 = valores[1];
    base3 = valores[2];
    objetivo1 = valores[3];
    objetivo2 = valores[4];
    objetivo3 = valores[5];

    return 0;
}

bool existe(int valor, int valores[], int tamanho) {
    for (int i = 0; i < tamanho; ++i) {
        if (valores[i] == valor) {
            return true;
        }
    }

    return false;
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

@Insurgent3      testei aqui e está funcionando bem , gera todos Números Aleatórios mesmos , talvez seja o compilador / IDE que você esteja Usando   . e seu código poderia ser Assim   :

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#define H GetStdHandle(STD_OUTPUT_HANDLE)
void textcolor_2(int l,int f){SetConsoleTextAttribute(H,l+(f<<4));}
int main (){
    srand (time(NULL));
    textcolor_2(14,0);
    printf ("Base 1 ------: %d\n", rand()%530 + 1);  // Base     número 1
    printf ("Base 2 ------: %d\n", rand()%530 + 1);  // Base     número 2
    printf ("Base 3 ------: %d\n", rand()%530 + 1);  // Base     número 3
    printf ("Objetivo 1 --: %d\n", rand()%530 + 1);  // Objetivo número 1
    printf ("Objetivo 2 --: %d\n", rand()%530 + 1);  // Objetivo número 2
    printf ("Objetivo 3 --: %d\n", rand()%530 + 1);  // Objetivo número 3
   return 0;
}

 

  • Amei 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!