Olá pessoal, sou o Filipe Névola, este blog foi muito ativo durante 2009 enquanto eu fazia universidade,
hoje em dia estou ativo no Twitter @FilipeNevola e voltando a escrever posts agora no meu perfil do Medium (29/05/2016).

[ 31/05/2009 ] 11

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 aleatóriedade, 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 inicilizar a função rand é usar a srand. Como usá-la?


Segue abaixo um código que gera um vetor aleatório e usa srand:
//Autor: Filipe Areias Névola
//Ano: 2009
//Programa: Usando rand com inicilização de semente
//Licensa: 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 aleatóriamente
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;
}
}

Alguma dúvida ? Pergunte através dos comentários!
Daniel Quadros comentou:

Uma dica (que talvez você já conheça) para colocar código no post: se disponível entre num modo de edição de HTML e use as sequências &gt; &lt; &amp; etc. (curiosidade: estou usando aqui estas sequências).

Sobre os números aleatórios, a explicação de que "o programa mantém em memória os dados da outra execução" esta incorreta. No C/C++ (e na maioria das outras linguagens) é 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ê obtêm a mesma sequência.

Filipe Névola comentou:

Arrumei o post quanto aos > e etc. Eu os usava para outras coisas e nem percebi que para os códigos também serviria, obrigado.

E também arrumei a parte dos números aleatórios, eu quis dizer o que você explicou, mas estava dando a impressão que tudo ficava na memória quando na verdade eu quis dizer que a semente era a mesma.

Mas agora corrigi usando sua explicação. Obrigado

Volte sempre!

Anônimo comentou:

Olá, estou começando a estudar algoritmos agora, e por tenho de fazer um programa sobre a Teoria de Golbach, não sei se conhece... Enfim... Preciso de um rand que gere numeros aleatórios para mim, pois preciso verificar se os mesmos são primos senão, gero novos numeros, mas quando ele fica gerando novos numeros, sempre fica a mesma sequencia usando a semente "time(NULL)" ;/ Tem dica de alguma outra semente?

Filipe Névola comentou:

Olá Anônimo, mande isso para mim por e-mail que te mostro como fazer. (filipemkv@gmail.com)

Anônimo comentou:

Ola estou fazendo um projetinho, de um bingo, ae tenho que gerar varios numeros randomicos sao 9 de 10-30 e 9 de 30-50? sera que tem como voce me ajudar? att.Luiz

Filipe Névola comentou:

Olá Anônimo, o próprio post já lhe ajuda, basta pensar um pouco.

Quando você gera de 0 a 20 você também não está gerando de 10 a 30 ?

Basta somar 10 toda vez.

Exemplo: Gerou 1, soma 10 = 11
Gerou 0, soma 10 = 10
Gerou 20, soma 10 = 30.

entendeu?

Anônimo comentou:

Vou trocar NULL por 10?

"Leigo em C"

Anônimo comentou:

Legal parece que o blog ainda esta ativo ^^

Unknown comentou:

Olá Filipe.
estou fazendo um trabalho em C++,
o jogo FreeCell.
e preciso d uma função random q me de
numeros aleatórios de 0 a 51,
mas sem repetição.
tem idéia d como faz!?

bom, o trabalho é pra hj. kkkkkkkkkk
provavelmente nao vai dar tempo d vc me responder, mas nao custa tentar...
se eu tivesse achado o blog antes pelo menos...
=/

agradeço sua ajuda!

Filipe Névola comentou:

Bom dia Carioca,

os números vc já consegue sortear fica fácil, basta guardar os já sorteados (pode ser em um vetor) e se cair em um destes fazer o sorteio de novo.

Direto no random desconheço um modo dele sortear sem repetições, talvez até exista.

Mas como você não tem muito tento implemente essa solução que eu sugeri.

Caroline comentou:

Muito legal esse blog!! Me ajudou bastante, a minha dúvida foi resolvida com a explicação pra delimitar os números randômicos sem usar um laço de repetição... valeu!

int main() {
cout<<"Obrigada!";
system("PAUSE");
}

Novo Comentário