Linux slogan
Visite também: Segurança Linux · BR-Linux.org · Dicas-L · Doode · NoticiasLinux · SoftwareLivre.org · UnderLinux



» Screenshot
Linux: Motorola a1200 + MontaVista Linux
Por codespy
» Login
Login:
Senha:

Se você ainda não possui uma conta, clique aqui.

Esqueci minha senha


Dica

Gerando números aleatórios em C
Linux user
Publicado por Rogério Bragil em 19/08/2003

Login: bragil, 105358 pontos | Blog: http://www.bragil.net
[ Hits: 63740 ]

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

Leitura recomendada
   Dica Linux recomendada Instalando a biblioteca libxml2
   Dica Linux recomendada Pequeno programinha em C para ver o ASCII de uma tecla
   Dica Linux recomendada Programando no Ubuntu - aplicações gráficas em C++ com Eclipse e Glade
   Dica Linux recomendada Limpando o buffer do teclado em C
   Dica Linux recomendada Kylix - Ferramenta para programadores Delphi

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 knancys 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


Contribuir com comentário


  
Para executar esta ação você precisa estar logado no site, caso contrário, tudo o que for digitado será perdido.
Responsável pelo site: Fábio Berbert de Paula - Conteúdo distribuído sob licença GNU FDL
Site hospedado por:

Viva o Linux

A maior comunidade Linux da América Latina! Artigos, dicas, tutoriais, fórum, scripts e muito mais. Ideal para quem busca auto-ajuda em Linux.