Pular para o conteúdo

Gerando números aleatórios em C

Dica publicada em C/C++ / Introdução
Rogério Bragil bragil
Hits: 141.138 Categoria: C/C++ Subcategoria: Introdução
  • Indicar
  • Impressora
  • Denunciar
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

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;
}
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

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.

O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Limpando a "sujeirinha" no buffer do teclado

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

Como Converter uma String em Char Array em C++

Corrigindo o erro: C compiler cannot create executables

Site com questões de programação

getch() e getche() não funcionam no ANSI

Instalando a biblioteca libxml2

#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

Entre na sua conta para comentar.