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.

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>
void preenche_sem_repeticao(int v[], int n) {
// 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;
}
}

Exercícios relacionados