Gerando números aleatórios em C: rand, srand e seed

Você pode nunca ter ficado atento para isso, mas números aleatórios são vitais em praticamente todos os ramos da computação;

Em jogos que você joga contra os inimigos, como eles sempre aparecem em posições e lugares diferentes? Simples, eles aparecem aleatoriamente.

Quando vai jogar Age of Empires, por que o local onde sua civilização começa é sempre diferente? Simples, o local foi escolhido aleatoriamente.

E por aí vai. Se é importante e é muito usado, é óbvio que o curso C Progressivo vai ensinar, e agora, neste tutorial de C de nossa apostila.


Clique aqui e saiba como obter seu certificado de programação C! Entre já no Mercado de Trabalho!


Números aleatórios em C

À rigor,  não existem números aleatórios em Computação. Computadores não pensam ou sorteiam. Computadores obedecem a comandos. O que eles fazem é o mesmo que seus programas fazem: entram laços, loopings, testes condicionais etc (obviamente, mais complexamente, mas à rigor, fazem o mesmo).

Então, os computadores também usam algoritmos e códigos para gerarem esses números que devem ser, teoricamente, aleatórios. Porém, nunca serão totalmente aleatórios, pois são gerados por código, por funções e tarefas específicas

O que vamos falar, na verdade, é sobre números pseudo-aleatórios. São funções e algoritmos matemáticos complexos, e ainda é um tema bastante utilizado ainda hoje.
Porém, isso foge do objetivo de nossa apostila online de C.

Uma boa tentativa de deixarem os números mais aleatórios possíveis, ‘alimentar’ seu algoritmo com números diferentes. Obviamente, o código de uma função que gera números aleatórios é sempre o mesmo, mas se você fornecer números diferentes, ela vai gerar seqüencias diferentes de números aleatórios.

Esses números que fornecemos são chamados de semente, ou seed.
E vamos usar o tempo (sim, o tempo cronológico), como semente.


A função rand() - Gerando números aleatórios

Pois bem, agora que você já sabe a importância dos números aleatórios no mundo da programação, e no da computação em geral, vamos iniciar nossos estudos

Vamos iniciar mostrando uma função que é comumente usada.
Porém, não vamos usá-la na maneira padrão, pois como vamos mostrar logo mais, há alguns problemas e ajustes necessários a se fazer.

A função que gera números aleatórios em C é a rand().

Ela gera números entre 0 e RAND_MAX, onde esse RAND_MAX é um valor que pode variar de máquina pra máquina.

Pra usar a função rand(), temos que adicionar a biblioteca time.h e para saber o valor de RAND_MAX, temos que usar a função stdlib.h.

Veja um programa que gera 10 números aleatórios em C:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int main(void)
{
    int i;
    printf("intervalo da rand: [0,%d]\n", RAND_MAX);
 
    for(i=1 ; i <= 10 ; i++) 
        printf("Numero %d: %d\n",i, rand());
 
}


Alimentando a rand() com a srand() : seed

Parece tudo ok, não? Veja os números gerados no exemplo passado.

Agora feche e rode o programa novamente. E de novo, de novo...notou?
(não vale enrolar! teste mesmo!)

A seqüência gerada é sempre a mesma. Para mudar isso, vamos alimentar a função rand() com uma semente, com um número, que é o tempo atual.

Assim, toda vez que rodarmos o programa, a rand() pega um número de tempo diferente e gera uma seqüencia diferente.
Para fazer isso, basta usar a função srand(), que será responsável por alimentar a rand(). Fazemos isso adicionando o comando: srand( (unsigned)time(NULL) ); antes da rand().

E agora nosso aplicativo em C gera uma seqüencia diferente toda vez que rodamos:

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

int main()
{
    int i;
    printf("intervalo da rand: [0,%d]\n", RAND_MAX);
    srand( (unsigned)time(NULL) );

    for(i=1 ; i <= 10 ; i++)
        printf("Numero %d: %d\n",i, rand());
}


Escolhendo uma faixa de números aleatórios em C

Ok, agora você é mestre nas artes de geração aleatória de números em linguagem C.
Porém, seu código gera números entre 0 e RAND_MAX.

E se você quiser gerar entre 0 e 10? Ou entre 1 e mil?
Ou entre 0.00 e 1.00?

Para escolher a faixa de valores vamos usar operações matemáticas, principalmente o operador de módulo, também conhecido como resto da divisão: %

Para fazer com que um número ‘x’ receba um valor entre 0 e 9, fazemos:
x = rand() % 10

Para fazer com que um número ‘x’ receba um valor entre 1 e 10, fazemos:
x = 1 + ( rand() % 10 )

Para fazer com que um número ‘x’ receba um valor entre 0.00 e 1.00, primeiro geramos números inteiros, entre 0 e 100:
x = rand() % 101

Para ter os valores decimais, dividimos por 100:
x = x/100;

Fácil, não?
Pois bem, com os conhecimentos adquiridos até o momento, já podemos criar um jogo em que nós mesmos poderemos jogar e mandar para os amigos.



Como criar um Jogo em linguagem C

Crie um jogo, em C, que sorteia um número entre 1 e mil.
O jogador deve tentar acertar o número sorteado.

Se ele errar, o programa deve dizer se o número sorteado é maior ou menor que o número que o jogador tentou.

Ao acertar o número sorteado, o programa deverá dizer em quantas tentativas o usuário acertou.

Você consegue pensar na melhor estratégia para esse jogo?

39 comentários:

Marcelo Romeu Gonçalves disse...

E se eu quiser gerar números entre [-1 , 2]?

Apostila C Progressivo disse...

Olá Marcelo,

Se atente sempre aos intervalos.
Você quer gerar números entre -1 e 2, que é um intervalo de 3 números.

Gere, então, números entre: [0,3]
Depois, subtraia o resultado de -1
Terá números entre [-1, 2]

Anônimo disse...

O meu ficou assim....

#include
#include
int menu();
int tentativas();
int sorteio();

int main()
{
sorteio();
return 0;
}

int menu()
{
int a;
printf("\n\t\tGame de Tentativa e Erro\n\nTente Acertar o Numero entre 0 e 1000\nDigite um numero: ");
scanf("%d",&a);
return a;
}
int tentativas()
{
int x;
srand((unsigned)time(NULL));
x=rand()%1001;
return x;
}
int sorteio()
{
int b=0, c, d=tentativas();
do
{
c=menu();
b++;
if(cd)
{
printf("\n\nEsse Numero e MAIOR...");
getch();
system("cls||clear");
}
}while(c!=d);
printf("\n\n\tVOCE ACERTOU O NUMERO :D!!!!!\n\t %d\n\t %d Tentativas",d,b);
getch();
}

Giobrit disse...

Minha tentativa espero que gostem!
:)

#include
#include
#include
#include

//autor: Giobrit

#define cor_programa "color 17"
#define limpa_tela "cls"

int valor_sorteado,tentativas[1000],indice=-1,cont=0; //variaveis globais

void boas_vindas(){
printf(" __________________________________________________________\n");
printf("| |\n");
printf("| ->Bem vindo<- |\n");
printf("| |\n");
printf("| O objetivo deste jogo eh acertar um numero entre |\n");
printf("| 1 e 1000 no menor numero de tentativas, |\n");
printf("| |\n");
printf("| Atencao o programa indicara se a tentativa eh |\n");
printf("| maior ou menor que a resposta! |\n");
printf("| |\n");
printf("| Autor: Giobrit |\n");
printf("|__________________________________________________________|\n");
getch();
system(limpa_tela);
}

int sorteia_valor(int *valor){
srand(time(NULL));
*valor = 1+(rand()%1000);
}

void mostra_tentativas(int mostrar){
printf("%d\t",mostrar);
}

int pergunta_usuario(int *numero){

printf("\n\n\n\n Informe uma tentativa: ");
scanf("%d",&*numero);
}

void maior_menor(int ma_me){
printf("\n\n ");

if(ma_me > valor_sorteado){
printf("A sua tentativa eh maior eh o numero sorteado");
sleep(3);
}

if(ma_me < valor_sorteado){
printf("A sua tentativa eh menor eh o numero sorteado");
sleep(3);
}

}

int main()
{
system(cor_programa);

boas_vindas();

sorteia_valor(&valor_sorteado);


do{
system(limpa_tela);

for(cont=0;cont<=indice;cont++)
mostra_tentativas(tentativas[cont]);
indice ++;

pergunta_usuario(&tentativas[indice]);

maior_menor(tentativas[indice]);

}while(tentativas[indice]!=valor_sorteado);

system(limpa_tela);

printf("\n\n\n Parabens vc acertou em %d tentativas!!!",indice+1);

}

Caique Portela disse...

Fiz o meu da maneira que acho mais simples... não gosto de ficar usando WHILE/DO WHILE para ficar criando menus, acho desnecessário. Olhem:



#include

int random,
tentativas=0,
num;

int main()
{
srand(time(NULL));
random=(rand()%1001);

init();
}

void init()
{
printf("\t\tBem-vindo(a)! Tente sua sorte nesse incrivel jogo.\n");
printf("\t\tUm n%cmero aleatorio foi gerado, e voc%c ter%c que descobri-lo!\n\n",163,136,160);

jogo();
}

jogo()
{
printf("Digite o n%cmero que voce acha que %c o correto: ",163,130);
scanf("%d",&num);

verifica(num);
}

void verifica(int num)
{
system("clear || cls");
char *ret;
if(num == random)
{
printf("Parab%cns! Voc%c acertou o n%cmero correto em %d tentativas.",130,136,163,(tentativas+1));
}
else
{
if(num < random)
{
printf("Voc%c errou! O n%cmero correto %c maior que %d\n\n",136,163,130,num);
errou();
}
else
{
if(num > random)
{
printf("Voc%c errou! O n%cmero correto %c menor que %d\n\n",136,163,130,num);
errou();
}
}
}
}

void errou()
{
tentativas++;
jogo();
}



Obs: Está com os acentos funcionando em códigos binários da tabela ASCII.

Anônimo disse...

como gerar numeros aleatorios de 0 a 1 bilhao?

Gabriel Silva de Carvalho disse...

E se eu quiser gerar numeros de 0 a 1 bilhão?

Tenho que fazer isso, porem não estou achando...

Apostila C Progressivo disse...

Gabriel, tentou usar o que ensinamos na parte "Escolhendo uma faixa de números aleatórios em C" ?

Renan Melo disse...

E se eu quiser somar esses aleatorios? por exemplo, alguns numeros aleatorios entre 1 e 10, e quero soma-los? eu fiz como vetor mas não ta somando correto
--------------------------------
#include
#include
#include
#define RAND_MAX 1000000
main(){

int i,n,soma=0, vet[5];

printf("intervalo de rand: [0, %d]\n",RAND_MAX);
srand((unsigned)time(NULL));

for (i=1; i<6;i++){
printf("%d\n", rand()%10);
vet[i] = rand()%10;
soma = soma + vet[i];
}
printf("\n A soma dos 5 elementos: %d", soma);



}

Alexandre Tavares disse...

#include
#include

main(){


int ale;
int conta=0;
int valor=0;

srand((unsigned) time(NULL));
ale=1+rand()%10000;

printf("Bem vindo ao jogo!!!\n");
printf("Nos sortemas um numero aleatorio entre 1 e 1000. Tente acerta-lo\n");


do{
printf("Informe um numero: \n");
scanf("%d",&valor);

if(valor>ale)
printf("O numero que voce digitou e maior que o gerado\n");
else
if (valor<ale)
printf("O numero que voce digitou e menor que o gerado\n");


conta++;
}

while (valor!=ale);

printf("Parabens!! Voce acertou com %d tentativas",conta);
}

Anônimo disse...

#include
#include
#include

void main()

{

int num,x;
int tent=0;

srand(time(NULL));
x=rand()%100;

do

{
printf("\nDigite um numero: ");
scanf("%d",&num);

if (num>x)

{

printf("O numero e menor que %d\n\n",num);

}

else

{

if (num<x)

printf("O numero e maior que %d\n\n",num);

else

{

printf("\n\nACERTOU!!");
printf("\nNumero de tentativas: %d",tent);

}
}

tent++;

}

while (num!=x);

}

Pedro Marques disse...

Muito esse site.....

Anônimo disse...

Quero que saia um tipo diferente por pessoa, mas por algum motivo esta saindo o mesmo tipo para todos:

#include
#include
#include 9
using namespace std;

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) {
int x, i;
string vet[18];

vet[0] = "Bug";
vet[1] = "Rock";
vet[2] = "Steel";
vet[3] = "Flying";
vet[4] = "Fire";
vet[5] = "Dragon";
vet[6] = "Normal";
vet[7] = "Fighting";
vet[8] = "Electric";
vet[9] = "Rock";
vet[10] = "Water";
vet[11] = "Ground";
vet[12] = "Grass";
vet[13] = "Fairy";
vet[14] = "Ice";
vet[15] = "Poison";
vet[16] = "Dark";
vet[17] = "Ghost";


srand( (unsigned)time(NULL) );
x = rand() % 18;
cout<<"Player1 was the choosen of "<<vet[x]<<" type.\n";
srand( (unsigned)time(NULL) );
x = rand() % 18;
cout<<"Player2 was the choosen of "<<vet[x]<<" type.\n";
srand( (unsigned)time(NULL) );
x = rand() % 18;
cout<<"Player3 was the choosen of "<<vet[x]<<" type.\n";
srand( (unsigned)time(NULL) );
x = rand() % 18;
cout<<"Player4 was the choosen of "<<vet[x]<<" type.\n";
srand( (unsigned)time(NULL) );
x = rand() % 18;
cout<<"Player5 was the choosen of "<<vet[x]<<" type.\n";
srand( (unsigned)time(NULL) );
x = rand() % 18;
cout<<"Player6 was the choosen of "<<vet[x]<<" type.\n";

return 0;
}

Pablo Miranda disse...

Como eu defino o intervalo ? Deixa eu ser mais claro, quero gerar números entre 8 e 9. Ou Sai 8 ou sai 9, já tentei colocar rand()%(8|9) mas não geram apenas números entre oito e nove.

Apostila C Progressivo disse...

Olá Pablo,

Leia a última parte do artigo, sobre como escolher a faixa de números.

Para você definir sua faixa de números com a rand, você deve fazer algumas manipulações matemáticas.

No seu caso, gere números entre 80 e 90, e depois dividida por 10, assim terá números entre 8 e 9 com uma casa decimal.

Se quiser números com duas casas decimais, gere números entre 800 e 900 e depois divida por 100.

Anônimo disse...

Muito obrigada pelo seu texto!! Fiz aula disso em universidades ditas de primeiro mundo e a explicação não chegou aos pés da sua. PARABÉNS e obrigada novamente!

Pablo Miranda disse...

Muito obrigado ! Eu consegui resolver !

Anônimo disse...

Ou tem como fazer o programa gerar não só números mas também misturar letras tipo numa sequencia de 12 caracteres aleatórios?

Anônimo disse...

O jogo de adivinhação que eu criei ficou assim :


#include
#include
#include
#include
#include
#include
#include

#define N 5

using namespace std;

int main(){


textcolor(2);

_tsetlocale(LC_ALL, _T("portuguese_brazil"));

/* */
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO CCI;
GetConsoleCursorInfo(hOut, &CCI);
CCI.bVisible = false;
SetConsoleCursorInfo(hOut, &CCI);
/* */



/* */
system ("title JOGO DA ADIVINHAÇÃO");
system("mode con:cols=140 lines=65");
/* */

char jda[25]="JOGO DA ADIVINHAÇÃO !!!";
int cdt;

char pva[40]="PARABÉNS !!! VOCÊ ACERTOU O NOME EM";

Sleep (1500);
printf ("\n\n\t\t\tBem");
Sleep (1500);
printf (" Vindo");
Sleep (1500);
printf (" Ao");
Sleep (1500);
printf (" ...");
Sleep (2250);
clrscr();
Sleep (2700);

printf ("\n\n\n\n\n\n\n\t\t\t\t\t\t%s",jda);
Sleep (3000);
system ("cls");

for (cdt=0; cdt<6; cdt++){
printf ("\n\n\n\n\n\n\n\t\t\t\t\t\t%s",jda);
Sleep (500);
clrscr();
Sleep (500);

}

/* */
textcolor(7);
textbackground (1);
system ("color 17");
system ("color 17");

printf ("Aperte qualquer tecla para iniciar o jogo...");
system ("pause>nul");
clrscr();
/* */
/* */
char n0[15]="alex", n1[15]="alexandre", n2[15]="amanda", n3[15]="anderson", n4[15]="arthur", n5[15]="bruno", n6[15]="cleyton";
char n7[15]="daniel", n8[15]="danilo", n9[15]="erika", n10[15]="francimar", n11[15]="guilherme", n12[15]="isabella", n13[15]="jeanderson";
char n14[15]="jessica", n15[15]="lilian", n16[15]="lucas", n17[15]="luis", n18[15]="marcos", n19[15]="thayna", n20[15]="victor";
int idn;

char grupo_de_nomes [200]="\n\tAlex\t\tDaniel\t\tJessica\n\tAlexandre\tDanilo\t\tLilian\n\tAmanda\t\tErika\t\tLucas\n\tAnderson\tFrancimar\tLuis\n\tArthur\t\tGuilherme\tMarcos\n\tBruno\t\tIsabella\tThayna\n\tCleyton\t\tJeanderson\tVictor";
char aposta[30];

int i , op , jog_niv , rec_niv , op_jog_niv1;
int rec_n1=-1, rec_n2=1000000, rec_n3=1000000;

/* */

Anônimo disse...

do{
char n_c[15];
int n_ten=0;
int completou=-1;

clrscr();

printf ("\n\n\n\n\t\tMENU\n\n\n\n\t2) = RECORDES\n\n\t1) = JOGAR\n\n\t0) = FINALIZAR JOGO E PROGRAMA");
printf ("\n\n\n ");
scanf ("%i",&op);

rec_niv=-1;
jog_niv=-1;

switch (op){

case 1 :

clrscr();

while (jog_niv!=0) {

clrscr();

printf ("\n\n\tESCOLHA O NIVEL DE DIFICULDADE PARA INICIAR A JOGATINA >>\n\n\n 0) VOLTAR AO MENU PRINCIPAL\n\n 1) JOGAR NIVEL 1\n\n 2) JOGAR NIVEL 2\n\n 3) JOGAR NIVEL 3\n\n\n");
scanf ("%i",&jog_niv);
clrscr();

if (jog_niv==1){
srand (time(NULL));
int m_o_m, i1, i2, ace=0, err=0;

for (i=0; i<20; i++){

printf ("\n NIVEL 1 >>\n TENTE DESCOBRIR SE O PRÓXIMO NÚMERO SERÁ MAIOR OU MENOR QUE O ANTERIOR >> DIGITE '0' SE FOR MENOR OU '1' SE FOR MAIOR\n (OS VALORES VÃO DE 0 À 1.000)");

printf ("\n\n\tO NÚMERO É %i",i1=rand()%1001);
printf ("\nO PRÓXIMO NÚMERO SERÁ MAIOR OU MENOR QUE ELE \? = ");
scanf ("%i",&m_o_m);
i2=rand()%1001;

if (m_o_m==0){
if (i2i1){
printf ("\n\nO PRÓXIMO NÚMERO SERIA = %i\nPARABÉNS VOCÊ ACERTOU !!!",i2);
ace+=1;
err+=0;
printf ("\nACERTOS = %i\tERROS = %i",ace,err);
Sleep (3000);
clrscr();
}
else {
printf ("\n\nO PRÓXIMO NÚMERO SERIA = %i\nVOCÊ ERROU !!!",i2);
ace+=0;
err+=1;
printf ("\nACERTOS = %i\tERROS = %i",ace,err);
Sleep (3000);
clrscr();
}
}
system ("cls");
clrscr();
}
system ("cls");
clrscr();

if(ace>rec_n1){
rec_n1=ace;
}
else{
rec_n1=rec_n1;
}
clrscr();
printf ("\n\t RESULTADO FINAL");
textcolor(2);
printf ("\n\n\n ACERTOS = %i",ace);
textcolor(4);
printf ("\t ERROS = %i",err);
textcolor(7);

printf ("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");

system ("PAUSE");

textcolor(7);
textbackground (1);
system ("color 17");
system ("color 17");

clrscr();

}

Anônimo disse...

if (jog_niv==2) {

clrscr();

printf ("\n\n 1) INICIAR NIVEL NORMALMENTE\n\n 2) INICIAR NIVEL COM AJUDA \"MÉDIA\" (SUA TENTATIVA INICIAL VALERÁ POR 5)\n\n 3) INICIAR NIVEL COM AJUDA \"FÁCIL\" (SUA TENTATIVA INCIAL VALERÁ POR 8)\n\n");
scanf ("%i",&op_jog_niv1);

if (op_jog_niv1 == 1) {

clrscr();

printf ("\n NIVEL 2 >> TENTE DESCOBRIR QUAL DOS NOMES ABAIXO FOI SORTEADO ! DIGITE O NOME QUE VOCÊ DESEJA EM SUA TENTATIVA =\n\n\n");
printf ("%s",grupo_de_nomes);
printf ("\n\n\n ");

srand (time(NULL));
idn=rand()%21;

idn==0 ? strcpy(n_c,n0) : idn==1 ? strcpy(n_c,n1) : idn==2 ? strcpy(n_c,n2) : idn==3 ? strcpy(n_c,n3) : idn==4 ? strcpy(n_c,n4) : idn==5 ? strcpy(n_c,n5) : idn==6 ? strcpy(n_c,n6) : idn==7 ? strcpy(n_c,n7) : idn==8 ? strcpy(n_c,n8) : idn==9 ? strcpy(n_c,n9) : idn==10 ? strcpy(n_c,n10) : idn==11 ? strcpy(n_c,n11) : idn==12 ? strcpy(n_c,n12) : idn==13 ? strcpy(n_c,n13) : idn==14 ? strcpy(n_c,n14) : idn==15 ? strcpy(n_c,n15) : idn==16 ? strcpy(n_c,n16) : idn==17 ? strcpy(n_c,n17) : idn==18 ? strcpy(n_c,n18) : idn==19 ? strcpy(n_c,n19) : strcpy(n_c,n20);

while (completou!=0){

printf ("\n\n");

GetConsoleCursorInfo(hOut, &CCI);
CCI.bVisible = true;
SetConsoleCursorInfo(hOut, &CCI);

printf (" TENTATIVA %i = ",n_ten+1);

scanf("%s",&aposta);
n_ten+=1;

GetConsoleCursorInfo(hOut, &CCI);
CCI.bVisible = false;
SetConsoleCursorInfo(hOut, &CCI);

if (strcasecmp (aposta,n_c) == 0){
printf ("%s %i tentativas",pva,n_ten);
Sleep (3000);
system ("cls");

if (n_ten<rec_n2){
rec_n2=n_ten;
n_ten=0;
completou=0;
jog_niv=0;
}

else{
rec_n2=rec_n2;
n_ten=0;
completou=0;
jog_niv=0;
}

}

else {
printf (" ESTÁ ERRADO !");
}


}

}

Anônimo disse...

if (op_jog_niv1 == 2) {

clrscr();

n_ten=4;

printf ("\n NIVEL 2 >> TENTE DESCOBRIR QUAL DOS NOMES ABAIXO FOI SORTEADO ! DIGITE O NOME QUE VOCÊ DESEJA EM SUA TENTATIVA =\n\n\n");
printf ("%s",grupo_de_nomes);
printf ("\n\n\n ");

srand (time(NULL));
idn=rand()%21;


idn==0 ? strcpy(n_c,n0) : idn==1 ? strcpy(n_c,n1) : idn==2 ? strcpy(n_c,n2) : idn==3 ? strcpy(n_c,n3) : idn==4 ? strcpy(n_c,n4) : idn==5 ? strcpy(n_c,n5) : idn==6 ? strcpy(n_c,n6) : idn==7 ? strcpy(n_c,n7) : idn==8 ? strcpy(n_c,n8) : idn==9 ? strcpy(n_c,n9) : idn==10 ? strcpy(n_c,n10) : idn==11 ? strcpy(n_c,n11) : idn==12 ? strcpy(n_c,n12) : idn==13 ? strcpy(n_c,n13) : idn==14 ? strcpy(n_c,n14) : idn==15 ? strcpy(n_c,n15) : idn==16 ? strcpy(n_c,n16) : idn==17 ? strcpy(n_c,n17) : idn==18 ? strcpy(n_c,n18) : idn==19 ? strcpy(n_c,n19) : strcpy(n_c,n20);
int cdl;
cdl = strlen(n_c);

printf (" DICA : O NOME \"CONTÉM\" A LETRA '%c'",n_c[rand()%cdl]);


while (completou!=0){

printf ("\n\n");

GetConsoleCursorInfo(hOut, &CCI);
CCI.bVisible = true;
SetConsoleCursorInfo(hOut, &CCI);

printf (" TENTATIVA %i = ",n_ten+1);
scanf("%s",&aposta);
n_ten+=1;

GetConsoleCursorInfo(hOut, &CCI);
CCI.bVisible = false;
SetConsoleCursorInfo(hOut, &CCI);

if (strcasecmp (aposta,n_c) == 0){
printf ("%s %i tentativas",pva,n_ten);
Sleep (3000);
system ("cls");

if (n_ten<rec_n2){
rec_n2=n_ten;
n_ten=0;
completou=0;
jog_niv=0;
}

else{
rec_n2=rec_n2;
n_ten=0;
completou=0;
jog_niv=0;
}
}

else {
printf (" ESTÁ ERRADO !");
}


}


}

Anônimo disse...

if (op_jog_niv1 == 3){

clrscr();
n_ten=7;

printf ("\n NIVEL 2 >> TENTE DESCOBRIR QUAL DOS NOMES ABAIXO FOI SORTEADO ! DIGITE O NOME QUE VOCÊ DESEJA EM SUA TENTATIVA =\n\n\n");
printf ("%s",grupo_de_nomes);
printf ("\n\n\n ");

srand (time(NULL));
idn=rand()%21;

idn==0 ? strcpy(n_c,n0) : idn==1 ? strcpy(n_c,n1) : idn==2 ? strcpy(n_c,n2) : idn==3 ? strcpy(n_c,n3) : idn==4 ? strcpy(n_c,n4) : idn==5 ? strcpy(n_c,n5) : idn==6 ? strcpy(n_c,n6) : idn==7 ? strcpy(n_c,n7) : idn==8 ? strcpy(n_c,n8) : idn==9 ? strcpy(n_c,n9) : idn==10 ? strcpy(n_c,n10) : idn==11 ? strcpy(n_c,n11) : idn==12 ? strcpy(n_c,n12) : idn==13 ? strcpy(n_c,n13) : idn==14 ? strcpy(n_c,n14) : idn==15 ? strcpy(n_c,n15) : idn==16 ? strcpy(n_c,n16) : idn==17 ? strcpy(n_c,n17) : idn==18 ? strcpy(n_c,n18) : idn==19 ? strcpy(n_c,n19) : strcpy(n_c,n20);

printf (" DICA : O NOME \"COMEÇA\" COM A LETRA '%c'",n_c[0]);

while (completou!=0){

printf ("\n\n");

GetConsoleCursorInfo(hOut, &CCI);
CCI.bVisible = true;
SetConsoleCursorInfo(hOut, &CCI);

printf (" TENTATIVA %i = ",n_ten+1);
scanf("%s",&aposta);
n_ten+=1;

GetConsoleCursorInfo(hOut, &CCI);
CCI.bVisible = false;
SetConsoleCursorInfo(hOut, &CCI);

if (strcasecmp (aposta,n_c) == 0){
printf ("%s %i tentativas",pva,n_ten);
Sleep (3000);
system ("cls");

if (n_ten>\tDESCUBRA QUAL É O NÚMERO SORTEADO EM UM INTERVALO ENTRE 0 E 1.000");
printf ("\nDIGITE O NÚMERO QUE VOCÊ ACREDITA QUE FOI SORTEADO ENTRE 0 E 1.000 = ");
n_sor=rand()%1001;

while (ten_sor!=n_sor){



printf ("\n\n\n TENTATIVA %i = ",++ten_con);
scanf ("%i",&ten_sor);

if (ten_sorn_sor){


printf ("ERRADO !! O NÚMERO SORTEADO É MENOR QUE %i",ten_sor);

}



if (ten_sor==n_sor){

printf ("PARABÉNS !! VOCÊ ACERTOU O NÚMERO EM %i TENTATIVAS",ten_con);
}





}

if (ten_con>\n\n 3) NIVEL 3\n\n 2) NIVEL 2\n\n 1) NIVEL 1\n\n 0) VOLTAR PARA O MENU PRINCIPAL\n\n\n");
scanf ("%i",&rec_niv);

Anônimo disse...

if (rec_niv==1) {

clrscr ();

printf ("\n\tRECORDE DO NIVEL 1 >>\n\n\n");


if (rec_n1==-1){

printf (" NENHUM DADO ARMAZENADO");

printf ("\n\n\n\n\n\n\n Pressione qualquer tecla para voltar ao MENU de RECORDES...");
system ("pause>nul");
clrscr();

}

else {
printf (" %i ACERTOS",rec_n1);
printf ("\n\n\n\n\n\n\n Pressione qualquer tecla para voltar ao MENU de RECORDES...");
system ("pause>nul");
clrscr();
}



}



if (rec_niv==2) {

clrscr ();

printf ("\n\tRECORDE DO NIVEL 2 >>\n\n\n");


if (rec_n2==1000000){

printf (" NENHUM DADO ARMAZENADO");

printf ("\n\n\n\n\n\n\n Pressione qualquer tecla para voltar ao MENU de RECORDES...");
system ("pause>nul");
clrscr();

}

else {
printf (" %i TENTATIVAS",rec_n2);
printf ("\n\n\n\n\n\n\n Pressione qualquer tecla para voltar ao MENU de RECORDES...");
system ("pause>nul");
clrscr();
}
}


if (rec_niv==3) {

clrscr ();

printf ("\n\tRECORDE DO NIVEL 3 >>\n\n\n");


if (rec_n3==1000000){

printf (" NENHUM DADO ARMAZENADO");

printf ("\n\n\n\n\n\n\n Pressione qualquer tecla para voltar ao MENU de RECORDES...");
system ("pause>nul");
clrscr();

}

else {
printf (" %i TENTATIVAS",rec_n3);
printf ("\n\n\n\n\n\n\n Pressione qualquer tecla para voltar ao MENU de RECORDES...");
system ("pause>nul");
clrscr();
}
}



}



}



}


while (op!=0);

/* */
system ("cls");
textcolor(2);
textbackground(0);
system ("color 02");

Sleep (2500);
printf ("\n\n\n\n\n\n\n\n\n\n\t\t\tT");
Sleep (1500);
printf ("\tC");
Sleep (1500);
printf ("\tH");
Sleep (1500);
printf ("\tA");
Sleep (1500);
printf ("\tW");
Sleep (1500);
printf ("\t!!!");
Sleep (600);
printf (" ...");

Sleep (3000);

clrscr();
printf ("Aperte qualquer tecla para sair...");
textcolor(0);
/* */

return EXIT_SUCCESS;






}

Alexandre Schnell disse...

Olá, primeiramente, excelente postagem, bem esclarecedora! (:
Mas tenho uma dúvida. Eu preciso fazer um projeto e minha profª de prog. n ensinou usar a função rand, mas eu vou precisar dela, só que o problema é o seguinte: Vou usar uma matriz 4x4, inicializando com os valores 0 (até aí tudo bem), mas em 2 posições aleatórias nessa matriz, eu preciso jogar o valor 2, mas n sei direito como fazê-lo, creio que devo usar o rand pra pegar as posições aleatórias das linhas e colunas de 0 a 3, mas n sei como. Poderia ajudar? Grato.

Anthony Matheus disse...

#include
#include
#include
#include

int main(int argc, char const *argv[]){
setlocale(LC_ALL, "Portuguese");

int numero, tentativas, numero_sorteio;

printf("Informe um número entre 1 e 1000: ");
scanf("%d", &numero);
srand( (unsigned)time (NULL) );

numero_sorteio = 1 + (rand() % 1000);

while(numero_sorteio != numero){
if(numero > numero_sorteio){

printf("O número informado é maior!!\n");
printf("Informe um número entre 1 e 1000: ");
scanf("%d", &numero);
tentativas++;

}else if(numero < numero_sorteio){

printf("O número informado é menor!!\n");
printf("Informe um número entre 1 e 1000: ");
scanf("%d", &numero);
tentativas++;

}
}
if(numero == numero_sorteio){
printf("Você acertou o número!!\nO número de tentativas foi '%d'", tentativas -1);
}
return 0;
}

Anônimo disse...

Consegui fazer um jogo de "adivinhe o numrand" bem simples na minha opnião, deu 56 linhas de código:

#include
#include
#include

int randk(int a){
srand((unsigned)time(NULL));
a = 1+(rand()% 1000);
return a;
}

int trys(int vezs,int tent,int rand){
if(tent != rand){
vezs++;
}
return vezs;
}

int relac(int tent, int rand,char relacao){
if(tent > rand){
relacao ='<';
}else{
relacao ='>';
}
return relacao;
}

int main(void){
int numero = randk(numero), vezes = 0, tentativa;
char relacao;

printf("------------------------------\n");//30 chars
printf(".=====JOGO DO NUM. RAND.=====.\n");
printf(". .\n");
printf(".Como Funciona:O Jogo lhe .\n");
printf(".dira para voce adivinhar um .\n");
printf(".numero de aleatortio de 1 a .\n");
printf(".1000 e de acordo com suas .\n");
printf(".tentativas o jogo dira se o .\n");
printf(".numero certo e maior ou .\n");
printf(".menor em relacao ao seu num;.\n");
printf("------------------------------\n");
printf("Chute Inicial:");
scanf("%d", &tentativa);

for(vezes = 1;tentativa != numero;vezes++){
printf("\nTentativas: %d;\n", vezes);
printf("O num e %c;\n", relac(tentativa, numero, relacao));
printf("Chute:");
scanf("%d", &tentativa);
printf("\n------------------------------");

if(tentativa == numero){
printf("\nGanhou!!!\nTentativas: %d;\n\n", vezes);
}
}
}

Anônimo disse...

Fiz um com base no que sei sobre programação em C (sou bem iniciante kk) e deu certo. Consegui fazer em 56 linhas. Não há parâmetros pois não gosto muito de usar.

#include
#include
#include

int randk(int a){
srand((unsigned)time(NULL));
a = 1+(rand()% 1000);
return a;
}

int trys(int vezs,int tent,int rand){
if(tent != rand){
vezs++;
}
return vezs;
}

int relac(int tent, int rand,char relacao){
if(tent > rand){
relacao ='<';
}else{
relacao ='>';
}
return relacao;
}

int main(void){
int numero = randk(numero), vezes = 0, tentativa;
char relacao;

printf("------------------------------\n");//30 chars
printf(".=====JOGO DO NUM. RAND.=====.\n");
printf(". .\n");
printf(".Como Funciona:O Jogo lhe .\n");
printf(".dira para voce adivinhar um .\n");
printf(".numero de aleatortio de 1 a .\n");
printf(".1000 e de acordo com suas .\n");
printf(".tentativas o jogo dira se o .\n");
printf(".numero certo e maior ou .\n");
printf(".menor em relacao ao seu num;.\n");
printf("------------------------------\n");
printf("Chute Inicial:");
scanf("%d", &tentativa);

for(vezes = 1;tentativa != numero;vezes++){
printf("\nTentativas: %d;\n", vezes);
printf("O num e %c;\n", relac(tentativa, numero, relacao));
printf("Chute:");
scanf("%d", &tentativa);
printf("\n------------------------------");

if(tentativa == numero){
printf("\nGanhou!!!\nTentativas: %d;\n\n", vezes);
}
}
}

Anônimo disse...

Queria saber como gerar valores aleatórios e esses valores não se repetirem quando eu executar o código. Tem algum jeito de fazer isso facilmente?

Raquel Simões disse...

Boa noite, podiam-me ajudar? Como faço usando estas funções e um LCD 16x2 fazer aparecer um caracter especial (bomba) da direita na primeira ou segunda linha aleatoriamente mas de forma que tenha um certo espaçamento para que outro caracter especial(boneco) fuja delas.

Álvaro Pereira disse...

e se eu quiser gerar numero de chaves (por exemplo 1000) do tipo com 5 numeros e duas estrelas ?

Anônimo disse...

Em um jogo são sorteados 6 itens em caixas. Mas 1 prêmio é especial que é o que eu quero pegar. Mas o prêmio tem uma pequena possibilidade de pegar o jogo me deu uma informação que os itens são gerados aleatoriamente, então alguém pode me ajudar a como ter uma maior possibilidade de pegar o item especial. Por favor me ajudem!

Marcos Antonio disse...

Como faço para gerar numeros entre -10,75 e +10,25?

Willian Bertoldo Dalla Favera disse...

Tentei compilar alguns códigos do jogo por ai e não rolou.
E vi uns código spaguethi louco ai huhauehauea

Mas vou deixar o código do meu jogo aqui porque ele ficou bem bonitinho.
Joguem pacas ai :p

#include
#include
#include

int sorteio(int i){

srand((unsigned)time(NULL));
i = rand()%1001;
return i;
}

main(){
int a,count,counter,num_sorteado,num;
char opcao;
a = 1;
count = 1;


printf("\t\t\t ADIVINHE O NUMERO!\n\n");
printf("\t\t\tO jogo funciona da seguinte maneira:\n\n");
printf(" Voce digita um numero entre 0 e 1000 ate voce acertar o numero sorteado.\n\n");
printf("\t\t\t\tBoa sorte!\n\n");

do{


if (counter == 1 ){
printf("\t\t\t\t Jogar?\n\n");
printf("\t\t\tDigite 'S'.Se nao, digite 'N': ");
}
else{
printf("\t\t\t Jogar novamente?\n\n");
printf("\t\t Digite 'S'.Se nao, digite 'N': \n\n\n\n\n\n\n\n\n\n\n\n\n");
}
scanf("%c",&opcao);

if(opcao == 'n' || opcao == 'N'){
return 0;
}
if(opcao =='s' || opcao == 'S'){
system("clear || cls");

num_sorteado = sorteio(num_sorteado);

for(count = 1;count>= 1;count++){
printf("Digite um numero: ");
scanf("%d",&num);

if(num_sorteado > num){
printf("O numero e MAIOR que %d.\n\n",num);
}
if(num_sorteado < num){
printf("O numero e MENOR que %d.\n\n",num);
}
if(num_sorteado == num){
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\tParabens! voce acertou!\n\n ");
printf("\t\tVoce utilizou %d tentativa(s) ate acertar.\n\n\n\n",count);
break;
}

}
}
counter ++;
fflush(stdin);
}while (a == 1);



}

Anônimo disse...

Ele gera sempre numeros iguais alguem ajuda???

#include"stdio.h"
#include"io.h"
#include"math.h"
#include"time.h"
#include

void main(){
printf("Ola, bem vindo ao BB (Bolao do Brasileirao), nesse mini-game voce podera escolher um time e tentar acertar os resultados dele: Para continuar aperte qualquer tecla; \n");
getche();
int time_escolha, primeiraR_spfc, primeiraR_santos, golspfc, golsantos, ptsantos, ptspfc;
int primeiraR_vasco, primeiraR_fla, golvasco, golfla, ptvasco, ptfla;
int primeiraR_cor, primeiraR_pal, golcor, golpal, ptcor, ptpal;
printf("Escolha seu Time: \n");
printf("1. Sao Paulo. \n");
printf("2. Santos. \n");
printf("3. Corinthas. \n");
printf("4. Palmeiras. \n");
printf("5. Flamengo \n");
printf("6. Vasco. \n");
scanf("%d", &time_escolha);
switch(time_escolha) {
case 1:
printf("Voce escolheu o Sao Paulo, voce tem 5 rodadas, o time que somar mais pontos vence a competicao. \n");
printf("Primeira Rodada: \n");
printf("Sao paulo x Santos \n");
printf("Vasco x Flamengo \n");
printf("Corinthas x Palmeiras \n");
printf("Tente advinhar o placar do jogo Sao Paulo x Santos: \n");
printf("Sao paulo: \n");
scanf("%d", &primeiraR_spfc);
printf("Santos: \n");
scanf("%d", &primeiraR_santos);
srand( (unsigned)time(NULL) );
golspfc = rand()%5;
printf("Sao paulo fez %d Gols. \n", golspfc);
srand( (unsigned)time(NULL) );
golsantos = rand()%5;
printf("Santos fez %d Gols. \n", golsantos);
printf("O jogo no total deu: \n");
printf("Sao Paulo %d x %d Santos \n", golspfc, golsantos);
if (golsantos > golspfc){
printf("Santos venceu, tente ganhar na rpoxima vez \n");
ptsantos = 3;
ptspfc = 0;
}
if (golsantos < golspfc){
printf("Sao Paulo Venceu, Parabens voce ganhou a primeira partida \n");
ptsantos = 0;
ptspfc = 3;

}
if (golsantos == golspfc){
printf("O jogo foi duro e empatou, cada time soma 1 ponto na tabela \n");
ptsantos = 1;
ptspfc = 1;
}
if(primeiraR_santos == golsantos && primeiraR_spfc == golspfc){
printf("Voce acertou o placar do jogo Sao Paulo x Santos, parabens!! \n");
printf("1 ponto a mais adicionado ao seu clube. \n");
ptspfc = ptspfc+1;
}

Henrique Brandão disse...

Boa tarde

no meu caso os numeros repetem..
alguma solucao para isso tendo em conta que tenho de criar um programa em que aparecam numeros nao repetitivos?

obrigado

Marselha disse...

E se o intervalo tiver que ser definido pelo valor digitado pelo teclado?
No meu programa, preciso ler dois valores máximos um é o tamanho do vetor e outro o intervalo de números aleatórios.

Kalill Lameira disse...

Olá gente, seguinte, vocês sabem como gerar valores entre intervalos maiores?

eu quero que o algoritmo gere CEP's de uma cidade qualquer por exemplo:
CEP=[77000-000 ... até ...77999-999]
usando uma desssas funções, rand, srand é possivel?

obg desde já pela ajuda!

Jonathan Reis disse...
Este comentário foi removido pelo autor.
Gostou desse tutorial de C?
Sabia que o acervo do portal C Progressivo é o mesmo, ou maior que, de um livro ou curso presencial?
E o melhor: totalmente gratuito.

Mas para nosso projeto se manter é preciso divulgação.
Para isso, basta curtir nossa página no Facebook e/ou clicar no botão +1 do Google.
Contamos e precisamos de seu apoio.