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!
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 > < & 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.
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!
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?
Olá Anônimo, mande isso para mim por e-mail que te mostro como fazer. (filipemkv@gmail.com)
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
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?
Vou trocar NULL por 10?
"Leigo em C"
Legal parece que o blog ainda esta ativo ^^
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!
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.
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");
}