Gerando números aleatórios em C

Publicado por Rogério Bragil em 19/08/2003

[ Hits: 140.286 ]

Blog: http://www.bragil.net

 


Gerando números aleatórios em C



Para gerar números aleatórios em C, temos duas funções que trabalham de forma semelhante:
  • rand;
  • e random.
Estas duas funções geram números aleatórios de 0 a RAND_MAX (definido no cabeçalho stdlib.h). Se você quiser gerar valores randômicos em uma determinada faixa numérica, basta fazer assim:

numero= rand() % valor_maximo;
ou
numero= random() % valor_maximo;

Para usá-las, porém, é necessário inicializar o gerador de números aleatórios com a função srand. Vejam um exemplo:

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

/* as funções rand(), random() e srand() estão no cabeçalho stdlib.h */

main()
{
     int i;
        
     /* inicializar o gerador de números aleatórios */
     srand(100);
     for (i=0; i<5; i++)
     {
           /* para gerar números aleatórios de 0 a 50 */
           printf("%d ", rand() % 50);
      }
      return 0;
}

Como você pode ver, os números aleatórios são criados, mas se você executar o mesmo programa várias vezes, aparecerão os mesmos números.

Isto acontece porque a inicialização do gerador de números aleatórios é constante (100). Para contornar este problema, vamos criar uma forma de inicializar com um número diferente a cada execução. Assim:

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

/* as funções rand(), random() e srand() estão no cabeçalho stdlib.h */

main()
{
     int i;
        
     /* inicializar o gerador de números aleatórios */
     /* com time(NULL)  */
     srand(time(NULL));
     for (i=0; i<5; i++)
     {
           /* para gerar números aleatórios de 0 a 50 */
           printf("%d ", rand() % 50);
      }
      return 0;
}

Assim os números aleatórios não repetirão a cada execução.

Outras dicas deste autor

Buscando intervalo de datas apenas pelo dia e mês no MySQL

Limpando a "sujeirinha" no buffer do teclado

Leitura recomendada

Compilando .EXEs no Linux (C/C++)

stty: alternativa para echo e noecho

Série de Fibonacci usando recursividade em linguagem C

Fazendo comparações sem o uso de IF, ELSE em C

Classes para vários tipos (templates)

  

Comentários
[1] Comentário enviado por jochan em 14/12/2005 - 14:44h

Muito legal, vai me ajudar bastente no meu projeto de C++ ... =)

[2] Comentário enviado por fdavid em 14/04/2006 - 00:24h

muito bom... agora não preciso ficar alimentando manualmente minhas matrizes nos exercicios da faculdade :-)

[3] Comentário enviado por bahiaboaterra em 19/06/2006 - 09:59h

Uso o DEV C++ e ele não reconhece a biblioteca stdlib.h
Porque será?

Preciso de um algoritmo que gere numeros aleatórios em um vetor de 500 posições. Alguém pode ajudar?

Obigado

[4] Comentário enviado por gabrielgrace em 19/08/2006 - 10:38h

Valeu ....

precisa mesmo gerar aleatoriamente zeros e uns e deu certo

Obrigado..

[5] Comentário enviado por mauad em 24/11/2006 - 23:51h

Olha, este código que tu escreveu está errado. Embora compile e rode, da forma com que tu chama a função rand() (rand() % N), o gerador te devolve os bits de ordem mais baixa, resultando em uma distribuição estatística inaceitável. Leia o manual (man 3 srand) e de uma olhada em http://www.fourmilab.ch/random/

mauad

[6] Comentário enviado por RogerioRamos em 11/01/2007 - 18:56h

Eu gostaria de obter um codigo que gerasse numeros p rodar no keil, esse codigo acima naum roda.

Obrigado..

[7] Comentário enviado por kallinef em 30/05/2007 - 15:56h

preciso de um gerador que elve em consideração a distribuição dos valores (estatistica) existe algum pronto, não entendo nada de programação mais estou precisando no meu trabalho. obrigada

kalline fabiana

[8] Comentário enviado por btc_cesar em 14/06/2007 - 12:51h

cara, nao tenho certeza mas tenta fazer esse codigo com numeros menores. (acho que ele vai ate max-1, pq ele pega o mod(resto) e o resto de 50 vai de 0 ate 49, ou seja max-1).

[9] Comentário enviado por albertguedes em 31/10/2007 - 13:10h

Em vez de usar time para a semente, leia um caractere do arquivo "/dev/urandom" que é um gerador realmente aleatório do sistema.

[10] Comentário enviado por marcotuliogm em 08/11/2007 - 19:31h

COMO EU FAÇO PARA GERAR OS NUMEROS COM REPETIÇÃO.
OU SEJA A ACADA UM QUE SURGIR EU ACRESCENTE UM IGUAL NA MINHA MATRIZ.

[11] Comentário enviado por hellpucrio em 17/03/2009 - 11:58h

Olá..gostei da funçao, soh gostaria de saber com eu faço para nao gerar numeros repetidos??

vlw...

[12] Comentário enviado por Ravengardy em 25/11/2010 - 14:39h

Muito bom cara... mas como é que ue faço pra colocar duas restrições como
de 10 a 100 e tb de 200 a 300.... ??

[13] Comentário enviado por albertguedes em 26/11/2010 - 11:27h

@Ravengardy Só fazer assim

x = valor_minimo + rand() % ( valor_maximo - valor_minimo ) ;

No seu caso, teríamos
valor_minimo = 10
valor_maximo = 100

ou

valor_minimo = 200
valor_maximo = 300

[14] Comentário enviado por pacheco2 em 18/10/2012 - 21:13h

Vlw pela contribuição, me ajudou muito :)



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts