Buscar

Texto explicativo sobre Funções rand() e srand()

Prévia do material em texto

Relembrando o que é uma função
Uma função é uma instrução que realiza um trabalho importante (como solicitar informações ao usuário ou calcular uma equação ou realizar um procedimento específico) e, então, retorna um resultado ao programa. O valor retornado por uma função pode ser atribuído a uma variável. As funções costumam utilizar um ou mais parâmetros, que são colocados entre parênteses e separados por vírgulas(quando for o caso), para definir suas atividades. 
Para gerar números pseudo-aleatórios em C podemos utilizar a função rand() da biblioteca stdlib.h.
rand() usa o relógio do sistema para criar um ponto inicial realmente aleatório, ou semente.
Cada chamada da função produz um número aleatório no intervalo fechado 0..RAND_MAX.
 
A constante RAND_MAX está definida no arquivo-interface stdlib.h.
 
Esta função utiliza uma “semente” para gerar sua sequência aleatória, portanto, se chamada sem a criação de uma semente diferente a cada execução, seu resultado será sempre o mesmo.
 
Para gerar esta semente chamamos a função srand() passando como parâmetro um valor de base. Este valor pode ser o resultado obtido da função time() que retorna o valor de milissegundos ocorridos no dia.
 
Algoritmo com exemplos:
 
#include <stdio.h>
#include <stdlib.h>
int main ( ) {
   int inteiro, x;
   printf("*** EXEMPLOS PARA USO DA FUCAO RAND ***\n\n");
   inteiro=rand();
   printf("inteiro aleatorio sem geracao de semente: %d\n",inteiro);
   srand(25);
   inteiro=rand();
   printf("inteiro aleatorio com semente fixa: %d\n\n",inteiro);
   srand(time(0));
   inteiro=rand();
   printf("inteiro aleatorio com semente baseada no time: %d\n\n",inteiro);
   printf("note que a partir deste ponto, depois que a funcao srand gerou a semente, \n as execucoes mostrarao numeros diferentes\n\n");
   inteiro = rand()%51;
   printf ( "inteiro de 0 a 50: %d\n\n" , inteiro) ;	// utilizar o operador de modulo nos garante que o 
         // resultado do resto de rand pelo divisor 51 eh um numero de
	// 0 a 50
   // simular o rolar de um dado de 6 faces
   printf ( "Simulacao de 3 jogadas para um dado de 6 faces\n\n") ;
   for (x=1; x<=3; x++) {
      inteiro = (rand()%6)+1; 	// como o numero gerado por rand vai de 0 a RAND_MAX, 
      // geramos o resultado de 0 a 5 e somamos 1 para garantir o intervalo de 1 a 6
      printf ("Dado rolado com resultado %d\n", inteiro);
   }
   // simular tres jogadas de cara ou coroa com moeda
   printf ( "Simulacao de cara ou coroa\n\n") ;
   for (x=1; x<=3; x++) {
      inteiro = (rand()%2); 	
      if (inteiro == 0) {
         printf ("Cara\n");
      } else {
	printf ("Coroa\n");
      }
   }
   getchar() ;
}
[ 31/05/09 ] �10 �
Rand, gerando números randômicos em C / C++ 
Rand, gerando números randômicos em C / C++
A maioria dos programadores que usam a função rand() não inicializam a semente da aleatoriedade, como consequência disso toda vez que o programa é executado são geradas as mesmas entradas.
Isto ocorre porque é usado um gerador de números pseudo aleatórios que basicamente é uma conta que é feita sobre o número atual para obter o seguinte. Se você parte do mesmo número, você sempre obtém a mesma sequência.
Em alguns casos isso é bom, principalmente quando não se tem certeza da corretude do programa; então, é necessário saber quais foram os dados de entrada para conseguir debugar melhor o código, mas na maioria das vezes isto não é desejado.
Então a solução para inicializar a função rand é usar a srand. Como usá-la?
Segue abaixo um código que gera um vetor aleatório e usa srand:
view plain�� HYPERLINK "http://www.allgoritmos.com/2009/05/rand-gerando-numeros-randomicos-em-c-c.html" \l "#" copy to clipboard�� HYPERLINK "http://www.allgoritmos.com/2009/05/rand-gerando-numeros-randomicos-em-c-c.html" \l "#" print�� HYPERLINK "http://www.allgoritmos.com/2009/05/rand-gerando-numeros-randomicos-em-c-c.html" \l "#" ?
//Autor: Filipe Areias Névola   
//Ano: 2009   
//Programa: Usando rand com inicilização de semente   
//Licença: Você pode usar e alterar, mas deve manter o Autor   
#include <stdio.h>   
#include <stdlib.h> //contém a rand e srand   
#include <time.h> //necessária para usar o time(NULL)   
  
#define MAX 100 //quero gerar elementos entre 1 e 100   
  
void entradaAleatoria(int tamanho){   
//vetor que conterá os números gerados aleatoriamente   
int v[tamanho];   
//iterador   
int i;   
  
//inicializando a semente do rand   
srand(time(NULL));   
  
//faço uma rand para cada elemento   
for(i=0;i<tamanho;++i){   
//rand() gerará vários números positivos   
//como quero somente entre 1 e 100 faço   
//mod MAX, logo terei elementos entre   
//0 e 99 então somo 1 sempre e terei elementos   
//entre 1 e 100 e vou guardando no vetor   
v[i]=(rand()%MAX)+1;   
}   
}

Continue navegando