Ir ao conteúdo

Ajuda com aleatoridade


dito

Posts recomendados

Postado

Ola pessoal,

Estou com um problema para terminar esse programa.

Ele deveria ler 5 numeros digitados pelo usuario entre 1 e 25. Em seguida gerar 10 numeros aleatorios entre 1 e 25 e comparar com os 5 primeiros para ver se não houve repetição.

No fim deve mostrar os 5 numeros digitados + os 10 alatórios sem repetição.

Já tentei de todo jeito, mas não consigo fazer com que não se repitam.

Segue abaixo um dos códigos que fiz:

#include <iostream>

#include <iomanip>

#include <stdio.h>

#include <time.h>

using namespace std;

int main()

{

system ("cls");

system ("color F0");

double vetor[15];

double x,y;

for(int i=1; i<6; i++){

cout << "\nDigites 5 nmeros de 1 a 25 ";

cin >> vetor;

}

for(int i=1; i<6; i++)

cout << i << " - " << vetor << endl;

srand ( (unsigned)time (NULL) );

for(int j=6; j<16; j++)

{

vetor[j]=rand()%25 + 1;

}

for(int j=6; j<16; j++)

cout << j << " - " << vetor[j] << endl;

system("PAUSE");

return 0;

}

Postado

Pergunta: Os números precisam mesmo ser double? Sempre que possível, crie um código mais simples possível, pois facilita o desenvolvimento.

1) O vetor em C começa sempre na posição 0 (zero) e não 1 (um). Isso vale para o 'for' também.

2) Separe os vetores. Crie um onde receberá os valores randomicos.

3) Coloque um outro 'for' dentro da rotina que insere os valores nesse vetor secundário, para poder validar se o valor a ser inserido já existe ou não. Use uma variável que fará o controle, caso já exista o número. Quando terminar esse 'for' de verificação, se não existir o número, então é só cadastrar, caso contrário, é gerar o número novamente.

Postado
Pergunta: Os números precisam mesmo ser double? Sempre que possível, crie um código mais simples possível, pois facilita o desenvolvimento.

1) O vetor em C começa sempre na posição 0 (zero) e não 1 (um). Isso vale para o 'for' também.

2) Separe os vetores. Crie um onde receberá os valores randomicos.

3) Coloque um outro 'for' dentro da rotina que insere os valores nesse vetor secundário, para poder validar se o valor a ser inserido já existe ou não. Use uma variável que fará o controle, caso já exista o número. Quando terminar esse 'for' de verificação, se não existir o número, então é só cadastrar, caso contrário, é gerar o número novamente.

Tem como você postar o código como você acha que deveria ser?

Eu meio que estou iniciando ainda no c++ não entendi muito os itens 2 e 3

Postado

O trecho principal seria mais ou menos assim:


int vetor_tmp[10];
int tmp = 0;
existe = 0;

for( j = 0; j < 10; j++ )
{

// Recebe valor aleatório
tmp = rand() % 25 + 1;

// Verifica se já foi escolhido
for ( i = 0; i <= j; i++ )
{
// Se foi escolhido, seta uma flag
if ( vetor_tmp[i] == tmp )
existe = 1;

}

// Se não foi escolhido, então cadastra
if ( existe == 0 )
vetor_tmp[j] = tmp;
else
{
existe = 0;
j--; // Como nao foi cadastrado, precisamos diminuir 'j', caso contrário não teremos todos os valores necessários
}
existe = 0;

}

Postado

Modifiquei o código usando as informações que você me forneceu, mas ainda não consegui. Ele continua não retirando os iguais mesmo com if que adicionei após a flag que você me falou.

Outra coisa estranha, quando eu digito os valores e peço pra listar no cout no final, ele coloca 0 no meu primeiro valor de saída.

Dá uma olhada como ficou, por favor:

#include <iostream>

#include <iomanip>

#include <stdio.h>

#include <time.h>

using namespace std;

int main()

{

system ("cls");

system ("color F0");

int vetor[5];

int x,y,j,i;

int vetor_tmp[10];

int tmp = 0;

int existe = 0;

for(int i=1; i<6; i++){

cout << "\nDigites 5 nmeros de 1 a 25 ";

cin >> vetor;

}

// for(int i=1; i<6; i++)

// cout << i << " - " << vetor << endl;

srand ( (unsigned)time (NULL) );

for( j = 0; j < 10; j++ )

{

// Recebe valor aleatório

tmp = 1+ rand() % 25;

// Verifica se já foi escolhido

for ( i = 0; i <= j; i++ )

{

// Se foi escolhido, seta uma flag

if ( vetor_tmp == tmp )

existe = 1;

}

// Se não foi escolhido, então cadastra

if ( existe == 0 )

vetor_tmp[j] = tmp;

else

{

existe = 0;

j--; // Como nao foi cadastrado, precisamos diminuir 'j', caso contrário não teremos todos os valores necessários

}

existe = 0;

}

if (existe==0){

for(int i=0; i<5; i++){

cout << i+1<< " - " << vetor << endl;

}

for(int j=0; j<10; j++){

cout << j+1 << " - " << vetor_tmp[j] << endl;

}

}

system("PAUSE");

return 0;

}

Postado

A questão de iniciar em 0 eu corrigi, era o primeiro for que estava errado. Mas ele continua gerando valores aleatórios incluido os que ja foram digitados

Dá só uma olhada:

#include <iostream>

#include <iomanip>

#include <stdio.h>

#include <time.h>

using namespace std;

int main()

{

system ("cls");

system ("color F0");

int vetor[5];

int x,y,j,i;

int vetor_tmp[10];

int tmp = 0;

int existe = 0;

for(int i=0; i<5; i++){

cout << "\nDigites 5 nmeros de 1 a 25 ";

cin >> vetor;

}

// for(int i=1; i<6; i++)

// cout << i << " - " << vetor << endl;

srand ( time (NULL) );

for( j = 0; j < 10; j++ )

{

// Recebe valor aleatório

tmp = 1+ rand() % 25;

// Verifica se já foi escolhido

for ( i = 0; i <= j; i++ )

{

// Se foi escolhido, seta uma flag

if ( vetor_tmp == tmp )

existe = 1;

}

// Se não foi escolhido, então cadastra

if ( existe == 0 )

vetor_tmp[j] = tmp;

else

{

existe = 0;

j--; // Como nao foi cadastrado, precisamos diminuir 'j', caso contrário não teremos todos os valores necessários

}

existe = 0;

}

if (existe==0){

for(int i=0; i<5; i++){

cout << i+1<< " - " << vetor << endl;

}

for(int j=0; j<10; j++){

cout << j+1 << " - " << vetor_tmp[j] << endl;

}

}

system("PAUSE");

return 0;

}

Postado

O vetor "vetor_tmp" está sendo inicializado com os valores já contidos em memória, ou seja, lixos. E nesse lixo, talvez venham números repetidos, coisa que o sistema não irá tratar.

Tente inicializar ele com "-1" (menos um), já que esse valor você não utilizará no momento de gerar os números aleatórios.

for ( j = 0; j < 10; j++ ){    vetor_tmp[j] = -1;}
Postado
O vetor "vetor_tmp" está sendo inicializado com os valores já contidos em memória, ou seja, lixos. E nesse lixo, talvez venham números repetidos, coisa que o sistema não irá tratar.

Tente inicializar ele com "-1" (menos um), já que esse valor você não utilizará no momento de gerar os números aleatórios.


for ( j = 0; j < 10; j++ )

{

vetor_tmp[j] = -1;

}

Postado

No momento está assim:

#include <iostream>

#include <iomanip>

#include <stdio.h>

#include <time.h>

using namespace std;

int main()

{

int j,i;

int tmp = 0;

int vetor[5];

int vetor_tmp[10];

int existe = 0;

system ("cls");

system ("color F0");

srand ( time(0) );

for(int i=0; i<5; i++){

cout << "\n Digite 5 números entre 1 e 25 ";

cin >> vetor;

}

for( j = 0; j < 10; j++ )

{

vetor_tmp[j] = -1;

// Recebe valor aleatório

tmp = 1+ rand() % 25;

// Verifica se já foi escolhido

for ( i = 0; i <= j; i++ )

{

// Se foi escolhido, seta uma flag

if ( vetor_tmp == tmp )

existe = 1;

}

// Se não foi escolhido, então cadastra

if ( existe == 0 )

vetor_tmp[j] = tmp;

else

{

existe = 0;

j--; // Como nao foi cadastrado, precisamos diminuir 'j', caso contrário não teremos todos os valores necessários

}

}

if(existe==0)

{

for(int i=0; i<5; i++){

cout << i+1<< " - " << vetor << endl;

}

for(int j=0; j<10; j++){

cout << j+6 << " - " << vetor_tmp[j]<< endl;

}

// }

}

system("PAUSE");

return 0;

}

Postado

O seu código está certinho.

A única coisa que não precisa existir, caso contário a saída será errada, é o último "if ( existe == 0 )".

Segue o seu código formatado por mim:


#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main( void )
{
int j, i;
int tmp = 0;
int vetor[5];
int vetor_tmp[10];
int existe = 0;

system ("cls");
system ("color F0");

srand ( time(0) );

for(int i=0; i<5; i++)
{
cout << "\n Digite 5 números entre 1 e 25 ";
cin >> vetor[i];
}

for( j = 0; j < 10; j++ )
{

vetor_tmp[j] = -1;

// Recebe valor aleatório
tmp = 1+ rand() % 25;

// Verifica se já foi escolhido
for ( i = 0; i <= j; i++ )
{
// Se foi escolhido, seta uma flag
if ( vetor_tmp[i] == tmp )
existe = 1;
}

// Se não foi escolhido, então cadastra
if ( existe == 0 )
vetor_tmp[j] = tmp;
else
{
existe = 0;
j--; // Como nao foi cadastrado, precisamos diminuir 'j', caso contrário não teremos todos os valores necessários
}

}

for ( i = 0; i < 5; i++ )
cout << "[USUARIO]: " << i + 1 << " - " << vetor[i] << endl;

for ( j = 0; j < 10; j++ )
cout << "[RANDOM]: " << j + 1 << " - " << vetor_tmp[j] << endl;

return 0;
}

Postado

ScreenBlack, muito obrigado pela revisão no código. Mas olha só como está a saída

Digite 5 n·meros entre 1 e 25 1

Digite 5 n·meros entre 1 e 25 2

Digite 5 n·meros entre 1 e 25 3

Digite 5 n·meros entre 1 e 25 4

Digite 5 n·meros entre 1 e 25 5

[uSUARIO]: 1 - 1

[uSUARIO]: 2 - 2

[uSUARIO]: 3 - 3

[uSUARIO]: 4 - 4

[uSUARIO]: 5 - 5

[RANDOM]: 1 - 8

[RANDOM]: 2 - 23

[RANDOM]: 3 - 22

[RANDOM]: 4 - 3 Aqui repetiu o 3 digitado pelo usuario

[RANDOM]: 5 - 1 Aqui repetiu o 1 digitado pelo usuario

[RANDOM]: 6 - 19

[RANDOM]: 7 - 21

[RANDOM]: 8 - 2 Aqui repetiu o 2 digitado pelo usuario

[RANDOM]: 9 - 18

[RANDOM]: 10 - 25

Pressione qualquer tecla para continuar. . .

São essas repetições que eu não estou entendendo como estão acontecendo ainda. O código ao meu ver está perfeito, retirando os numeros digitados pelo usuario da sequencia aleatória.

Mas a saída do programa diz o contrário.

O seu código está certinho.

A única coisa que não precisa existir, caso contário a saída será errada, é o último "if ( existe == 0 )".

Segue o seu código formatado por mim:


#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main( void )
{
int j, i;
int tmp = 0;
int vetor[5];
int vetor_tmp[10];
int existe = 0;

system ("cls");
system ("color F0");

srand ( time(0) );

for(int i=0; i<5; i++)
{
cout << "\n Digite 5 números entre 1 e 25 ";
cin >> vetor[i];
}

for( j = 0; j < 10; j++ )
{

vetor_tmp[j] = -1;

// Recebe valor aleatório
tmp = 1+ rand() % 25;

// Verifica se já foi escolhido
for ( i = 0; i <= j; i++ )
{
// Se foi escolhido, seta uma flag
if ( vetor_tmp[i] == tmp )
existe = 1;
}

// Se não foi escolhido, então cadastra
if ( existe == 0 )
vetor_tmp[j] = tmp;
else
{
existe = 0;
j--; // Como nao foi cadastrado, precisamos diminuir 'j', caso contrário não teremos todos os valores necessários
}

}

for ( i = 0; i < 5; i++ )
cout << "[USUARIO]: " << i + 1 << " - " << vetor[i] << endl;

for ( j = 0; j < 10; j++ )
cout << "[RANDOM]: " << j + 1 << " - " << vetor_tmp[j] << endl;

return 0;
}

Postado

Ah, achei que apenas o valor randomico é que não poderia ser repetido entre sí.

Para fazer isso que você quer, também é bem tranquilo. Basta fazer outra validação, assim como foi feita no vetor 'vetor_tmp', para saber já existe o valor em 'vetor'.

Exemplo:

        // Verifica se já foi escolhido pelo sistema        for ( i = 0; i < j; i++ )        {            // Se foi escolhido, seta uma flag            if ( vetor_tmp[i] == tmp )            existe = 1;        }
        // Verifica se já foi escolhido pelo usuario        for ( i = 0; i < 5; i++ )        {            // Se foi escolhido, seta uma flag            if ( vetor[i] == tmp )            existe = 1;        }
Postado

Cara você é mestre!!!! :aplausos:

Muitíssimo obrigado pela ajuda!

Ah, achei que apenas o valor randomico é que não poderia ser repetido entre sí.

Para fazer isso que você quer, também é bem tranquilo. Basta fazer outra validação, assim como foi feita no vetor 'vetor_tmp', para saber já existe o valor em 'vetor'.

Exemplo:

        // Verifica se já foi escolhido pelo sistema        for ( i = 0; i < j; i++ )        {            // Se foi escolhido, seta uma flag            if ( vetor_tmp[i] == tmp )            existe = 1;        }
        // Verifica se já foi escolhido pelo usuario        for ( i = 0; i < 5; i++ )        {            // Se foi escolhido, seta uma flag            if ( vetor[i] == tmp )            existe = 1;        }

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!