#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<unordered_set>
#include<vector>
#include<utility>
#include<algorithm>
using namespace std;

int main() {
	int n;
	int intervalo;
	printf("GERADOR DE N NÚMEROS ALEATÓRIOS\n");
	printf("Digite o número máximo do intervalo: ");
	scanf("%d", &intervalo); //Lê o intervalo máximo proposto pelo usuário.

	printf("Intervalo proposto: [1 a %d]\n\n", intervalo); //Mostra na tela o intervalo proposto pelo usuário.

	printf("Digite quantos números aleatórios e diferentes deseja gerar: ");
	srand(time(NULL)); //Complementa o comando rand. Toda vez que executar o programa, os números gerados não estejam na mesma sequência que anteriormente.
	scanf("%d", &n); //Lê a quantidade de números que serão mostrados na tela
    
    
    printf("\n--------\nVersão 1\n--------\n");

    std::unordered_set<int> numbers;
	for(int i=1; i<=n; i++) { // Coemça o intervalo em i, e mostra a quantidade de números até chegar em "n" que representa o intervalo proposto pelo usuário.
    	int number = 1 + (rand() % intervalo);
        bool inseriu = numbers.insert(number).second;
        if (inseriu) {
    		printf("%dº número: %d\n",i, number); //Aqui é onde é imprimido na tela o número aleatório gerado, entretanto, ele precisa ser diferente do número anterior gerado.
        } else {
        	printf("\t*%d é um número repetido, tentando novamente\n", number);
        	i--;
        }
	}
	
	printf("\n--------\nVersão 2\n--------\n");

	std::vector<int> numbers2(intervalo);
	std::iota(numbers2.begin(), numbers2.end(), 1);
	std::random_shuffle(numbers2.begin(), numbers2.end());
	for (int i=0; i<n; i++) {
		printf("%dº número: %d\n",i+1, numbers2[i]);	
	}
	
	return 0;
}