Números aleatórios com rand() e srand() [RESOLVIDO]

1. Números aleatórios com rand() e srand() [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 23/12/2009 - 01:49h

Boa noite, caros. :-)

Estou com um problema.
Fiz uma rotina para gerar 4 números aleatórios.
Sempre que o usuário aperta Enter, um número é imprimido na tela.
Até aí, tudo bem! :-D
Eis o problema: gostaria que os números não se repetissem, pra isto uso a função srand().
Ainda assim os números continuam se repetindo.
Alguém pode me indicar a solução?

Segue o código:

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

int main(int argc, char** argv) {

int num = 0,cont;

srand(time(0));
for (cont = 0; cont < 4; cont++) {
printf("Enter para pegar um numero: \n");
system("read key");
num = rand() % 4;
printf("Seu numero e': %d\n\n", num);
}

printf("Enter para continuar... \n");
system("read key");

return(0);
}


  


2. MELHOR RESPOSTA

Elgio Schlemer
elgio

(usa OpenSuSE)

Enviado em 23/12/2009 - 07:45h

Acontece que como você está gerando números de 0 a 3 existe muita possibilidade de repetição. Além do mais o operador de resto não é a melhor forma de se gerar números aleatórios devido a sua previsibilidade. Com %4 você está, na verdade, isolando os últimos 2 bits do número (00 01 10 ou 11) e eles tendem a ser mesmos repetitivos. Serve para propósitos simples, mas são números VICIADOS!

Uma maneira mais randomica ainda é desta forma:

num = 1 + (int)( 4.0 * rand() / ( RAND_MAX + 1.0 ) );

Onde 4.0 é o máximo que queres (ou seja, valores de 1 a 4). Se queres de 1 a 3, remova o 1+ e troque o 4.0 por 3.0:

num = (int)( 3.0 * rand() / ( RAND_MAX + 1.0 ) );


Agora, nem mesmo com esta tecnica tu espera que não haja repetição em meros 4 números!! Pouca amostragem para teres alguma coisa. Fiz um teste aqui com valores de 0 a 1000 e com o sorteio de 10000 numeros e a distribuição foi satisfatória.

Com 10 mil gerações de 0 a 9 veja o que tive:
4 = 1049 ocorrencias
1 = 1031 ocorrencias
8 = 1029 ocorrencias
9 = 1021 ocorrencias
6 = 1005 ocorrencias
5 = 1005 ocorrencias
2 = 994 ocorrencias
0 = 984 ocorrencias
3 = 969 ocorrencias
7 = 913 ocorrencias

Bem distribuido, não?



3. Re: Números aleatórios com rand() e srand() [RESOLVIDO]

Sandro Marcell
SMarcell

(usa Slackware)

Enviado em 23/12/2009 - 02:08h

Cara não entendo nada de C/C++ e por isso eu posso até estar falando besteira, mas... o que você poderia fazer é ir armazenando cada número gerado num array e ao se gerar um novo número, verificar se o mesmo já se encontra armazenado nesse array.


4. Re: Números aleatórios com rand() e srand() [RESOLVIDO]

José Mário
miura 787

(usa Ubuntu)

Enviado em 23/12/2009 - 02:25h

Tente isso!

Sinceramente não testei e fiz meio às pressas, a idéia é que você vá adicionando seus numeros em um vetor e a cada leitura randômica você verifique se o numero consta no vetor, caso negativo, ele exibe o numero, caso positivo ele le o numero randômico novamente.

Espero que ajude!\

Ats
Miura 787


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

int main(int argc, char** argv) {

int num = 0,cont;
int aux[4];

srand(time(0));
for (cont = 0; cont < 4; cont++) {
printf("Enter para pegar um numero: \n");
system("read key");
num = rand() % 4;
for (i=0;i < cont; i++){
if(aux[i] != num){
printf("Seu numero e': %d\n\n", num);
}
else{
cont--;
break;
}
}
}

printf("Enter para continuar... \n");
system("read key");

return(0);
}


5. Re: Números aleatórios com rand() e srand() [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 23/12/2009 - 02:53h

Sim, entendo a lógica de vocês.
Mas a questão é exatamente essa: procurei muito sobre uma função pré-definida para fazer essa geração de números aleatórios sem que houvesse repetição. Em vários lugares encontrei a srand() como solução.
Não entendo o que está dando errado.
Só para complementar, eu não gostaria de evitar repetições desta forma, fazendo comparações entre os índices dos vetores.
Mas de qualquer forma, muito obrigado pela ajuda.
Abraço.


6. Re: Números aleatórios com rand() e srand() [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 23/12/2009 - 08:49h

Excelente explicação Prof. Elgio.
Muito obrigado.
Um abraço.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts