Losowanie wszystkich liczb w przedziale od 1 do n bez powtórzeń

0

Cześć, czy jest jakiś szybki sposób na wylosowanie wszystkich liczb od 1 do n bez powtórzeń?
Chodzi mi o coś takiego że np jak mam przedział 1-10 to program zwraca losową kolejność wszystkich tych liczb np. 4 1 9 5 7 8 6 10 2 3.
Czy da się rozwiązać ten problem w sensownej złożoności dla n rzędu 10^5 ?
Mam taki program króry działa dla małych liczb ale dla większych działałby wieczność.

#include <bits/stdc++.h>
using namespace std;

int randrange(int a, int b){
    return rand()%(b-a+1)+a;
}
const int MAX = 100000;
const int seed = 67856534;
int n;
bool wylosowane[MAX+5];

int main(){
  ios_base::sync_with_stdio(false); 
  cin.tie(false);
  
  srand(seed);
  cin>>n;
  wylosowane[0] = true;
  for(int i=1; i<=n; i++){
    int akt = 0;
    while(wylosowane[akt])
      akt = randrange(1,n);
    wylosowane[akt] = true;
    cout<<akt<<' ';
  }
}

(Zdaję sobie sprawę, że tak się nie pisze kodów using namespace, zmienne globalne, importowanie wszystkich bibliotek itp, chodzi mi o samą szybkość.)

1 użytkowników online, w tym zalogowanych: 0, gości: 1