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ść.)