Unconfigured Ad Widget

Collapse

Anúncio

Collapse
No announcement yet.

[Dúvida] Problema no meu código

Collapse
This topic is closed.
X
X
 
  • Filter
  • Tempo
  • Show
Clear All
new posts

  • Font Size
    #1

    C / C++ [Dúvida] Problema no meu código

    E aí galera, to fazendo um exercício onde precisa criar uma função "dado()", utilizando a função "rand()", o problema é que tá gerando sempre o mesmo número:

    Código:
    #include <stdio.h>
    #include <time.h>
    #include <stdlib.h>
    
    int dado ();
    
    int main () {
        int x, x1 = 0, x2 = 0, x3 = 0, x4 = 0, x5 = 0, x6 = 0;
        int count;
    
    
        for(count=0 ; count < 1000000 ; count++)
            switch(dado()){
                case 1:
                    x1++;
                    break;
                case 2:
                   x2++;
                    break;
                case 3:
                    x3++;
                    break;
                case 4:
                    x4++;
                    break;
                case 5:
                    x5++;
                    break;
                case 6:
                    x6++;
            }
    
        printf("1 = %d \n2 = %d \n3 = %d \n4 = %d \n5 = %d \n6 = %d", x1, x2, x3, x4, x5, x6);
    
    }
    
    int dado () {
        int x;
        srand((unsigned)time(NULL));
        x = rand() % 6 + 1;
    
        return x;
    }
    Se vocês compilarem, vão ver que sempre um número entre 1 e 6 está sendo "sorteado" nas 1.000.000 de vezes. O que tem de errado no código?
    Similar Threads

  • Font Size
    #2
    Código:
    #include "stdafx.h"
    #include <stdio.h>
    #include <time.h>
    #include <stdlib.h>
    
    int dado();
    
    int main() {
    	srand(time(NULL));
    	int x, x1 = 0, x2 = 0, x3 = 0, x4 = 0, x5 = 0, x6 = 0;
    	int count;
    
    
    	for (count = 0; count < 1000000; count++){
    		switch (dado()) {
    		case 1:
    			x1++;
    			break;
    		case 2:
    			x2++;
    			break;
    		case 3:
    			x3++;
    			break;
    		case 4:
    			x4++;
    			break;
    		case 5:
    			x5++;
    			break;
    		case 6:
    			x6++;
    		}
    		}
    
    	printf("1 = %d \n2 = %d \n3 = %d \n4 = %d \n5 = %d \n6 = %d", x1, x2, x3, x4, x5, x6);
    	system("pause>nul");
    
    	return 0;
    
    }
    
    int dado() {
    	int x;
    
    	x = rand() % 6 + 1;
    
    	return x;
    }

    Coloque o srand(), no comeco do codigo.

    Comment


    • Font Size
      #3
      Nada de errado, é exatamente isto que seu código faz: sorteia um número entre 1 e 6. E explico por quê:

      Repare nas seguintes linhas, farei comentário sobre elas abaixo:

      Código:
      int x;
      srand((unsigned)time(NULL));
      x = rand() % 6 + 1;
      1º Declarou o X, perfeito.
      2º Passou uma "semente" ao srand, para garantir a aleatoriedade da função rand, perfeito.


      Acho que para explicar a linha abaixo é melhor quebrar ela em duas, vamos fazer assim:

      Código:
      x = rand();
      x = (x % 6) + 1
      Na primeira o X irá receber um valor aleatório, como desejado.

      Mas na segunda linha, este valor será substituído pelo mod dele com 6. O que sempre será (0 ou 1 ou 2 ou 3 ou 4 ou 5). É uma questão matemática, você precisará enxergar o porque sozinho, não há muito como explicar além de falar que "qualquer um número dividido por 6, sempre terá um resto no intervalo de inteiros [0,5], porque se o resto for 6 ele seria divisível mais uma vez, ou seja o quociente receberia +1 e o resto seria zero. (Se não ficou claro, pare e pense).

      Mas temos que ele retornara um valor pertencente ao intervalo [1,6] e não [0,5]. Por quê? Está é a parte fácil, e foi porque eu coloquei parentes para ficar mais visível, por causa do +1 no final da atribuição do valor ao X.

      O principal para entender o problema é enxergar a questão matemática envolta do mod e do rand. Se quer um valor totalmente aleatório, basta remover aquela linha. É muito usado o mod com a função rand, para limitar os número. Pense em um bingo, os números sorteados pertencem ao intervalo [1,50] e não aos conjunto dos números inteiros, por exemplo. Então passa-se o rand à variável do sorteiro e depois coloca o mod para limitar.

      Espero que tenha ficado claro. Qualquer coisa, basta dar um toque.
      Se expressarmos gratidão pelo que temos, teremos mais para expressar gratidão... Agradeça!

      Comment


      • Font Size
        #4
        Piratica, essa parte aí eu entendi, fui eu mesmo quem coloquei pra sair sempre resto entre 0 e 5 e somar com 1, pra sempre sair um número entre 1 e 6, kk. A minha dúvida é a seguinte: se você compilar meu código, a função dado() vai ser repetida 1000000 de vezes pelo laço "for", só que nas 1000000 de iterações, sempre o mesmo número está sendo sorteado, tipo, digamos que eu execute o programa agora, o número "2", por exemplo, é chamado pela função rand nas 1000000 de vezes, se eu executar de novo, outro número, por exemplo, 6, é chamado nas 1000000 de vezes. É isso que eu não estou entendendo. Se puderem me ajudar, agradeço muito.

        Comment


        • Font Size
          #5
          Então eu havia entendido errado, e não foi pouco.

          Mas se eu entendi bem o seu problema, se ele é porque ele repete o número n vezes, eu concordo com o fr0st. E compilando aqui ele parece estar correto, eu colocaria o srand no começo:

          Código:
          #include <stdio.h>
          #include <time.h>
          #include <stdlib.h>
          
          int dado ();
          
          int main () {
          	srand((unsigned)time(NULL));
              int x, x1 = 0, x2 = 0, x3 = 0, x4 = 0, x5 = 0, x6 = 0;
              int count;
          
          
              for(count=0 ; count < 1000000 ; count++)
              	switch(dado()){
                      case 1:
                          x1++;
                          break;
                      case 2:
                         x2++;
                          break;
                      case 3:
                          x3++;
                          break;
                      case 4:
                          x4++;
                          break;
                      case 5:
                          x5++;
                          break;
                      case 6:
                          x6++;
                  }
          
              printf("1 = %d \n2 = %d \n3 = %d \n4 = %d \n5 = %d \n6 = %d \n", x1, x2, x3, x4, x5, x6);
          
          }
          
          int dado () {
              int x;
              x = rand() % 6 + 1;
              return x;
          }
          Se expressarmos gratidão pelo que temos, teremos mais para expressar gratidão... Agradeça!

          Comment


          • Font Size
            #6
            É verdade, compilando aqui com o srand() no início a probabilidade dá certinho pra cada número. Mas vocês saberiam me explicar o porquê? Tipo, por que com o srand() na função dado() só chama um número e por que com ele no início chama todos certinho? Valeu!

            Comment


            • Font Size
              #7
              É uma questão simples, ou não. Mas vou tentar explicar.

              Você chama o srand() apenas uma vez no seu código, porque ele dá a semente, o valor inicial para a função rand. Por isso apenas na função main.

              Quando você coloca ele na função dado, será semeado várias vezes. E como o computador executará o lao muito rapidamente, a passagem entre a primeira e a segunda execução por exemplo, o tempo passado, que é o parâmetro da semente, será o mesmo.

              Talvez faça mais sentido se você colocar um printf ali no laço. Você perceberá que haverá uma variação do valor depois de um determinado tempo, mas será algo bem rápido por conta da velocidade de processamento, então se for fazer isso preste muita atenção nos valores.
              Se expressarmos gratidão pelo que temos, teremos mais para expressar gratidão... Agradeça!

              Comment


              • Font Size
                #8
                Ah, acho que eu entendi. Realmente, antes de deixar o código dessa forma eu tinha colocado um printf e ele repetia tipo "2" várias vezes, após um tempo repetia "4", por exemplo. Faz sentido mesmo, valeu Piratica!

                Comment


                • Font Size
                  #9
                  Isto fica feliz em ser útil!

                  Estou trancando o tópico, caso necessite OC-P procure-me, ou a algum outro membro da staff do GH, para reabrir o tópico
                  Se expressarmos gratidão pelo que temos, teremos mais para expressar gratidão... Agradeça!

                  Comment

                  X
                  Working...
                  X