Faça uma função que receba um vetor de inteiros e o preencha com números aleatórios sem repetição.
Passo 1
O enunciado pede uma função que receba um vetor de inteiros de tamanho n e o preencha com números aleatórios, garantindo que não haja repetição. O conteúdo de matéria aqui é geração de permutações aleatórias (sem repetição) usando o algoritmo de Fisher-Yates, e vamos precisar das funções rand(), srand() e de técnicas de troca (swap) em C.
Passo 2
Para garantir que não haja repetição, primeiro inicializamos o vetor com valores distintos (por exemplo, de 1 a n). Assim temos uma “lista mestre” de nºs únicos.
Em seguida aplicamos o algoritmo de Fisher-Yates: para i de n-1 até 1, escolhemos aleatoriamente um índice j entre 0 e i (inclusive) usando rand()%(i+1) e trocamos vetor[i] com vetor[j]. Isso embaralha todas as posições, produzindo uma permutação aleatória.
Em seguida aplicamos o algoritmo de Fisher-Yates: para i de n-1 até 1, escolhemos aleatoriamente um índice j entre 0 e i (inclusive) usando rand()%(i+1) e trocamos vetor[i] com vetor[j]. Isso embaralha todas as posições, produzindo uma permutação aleatória.
Passo 3
Antes de usar rand() é importante semear o gerador de números aleatórios para não obter sempre a mesma sequência. Fazemos isso chamando srand(time(NULL)) uma única vez, normalmente no início da função ou no main.
Passo 4
A seguir a integração de tudo em uma função em C: incluímos <stdlib.h> e <time.h>, fazemos srand(), inicializamos o vetor e depois embaralhamos com Fisher-Yates.
Resposta
#include <stdlib.h>
#include <time.h>
#include <time.h>
void preenche_sem_repeticao(int v[], int n) {
// Semeia o gerador (chamar uma vez antes de preencher vários vetores)
srand((unsigned) time(NULL));
// Semeia o gerador (chamar uma vez antes de preencher vários vetores)
srand((unsigned) time(NULL));
// 1) Inicializa o vetor com valores distintos de 1 a n
for (int i = 0; i < n; i++) {
v[i] = i + 1;
}
// 2) Embaralha usando Fisher-Yates
for (int i = n - 1; i > 0; i--) {
int j = rand() % (i + 1); // escolhe j uniformemente entre 0 e i
// swap v[i] ↔ v[j]
int tmp = v[i];
v[i] = v[j];
v[j] = tmp;
}
}