Generate a random permutation of 1 to N

• Difficulty Level : Medium
• Last Updated : 27 May, 2021

Given an integer N, the task is to generate N non-repeating random numbers.

Examples:

Input: N = 5
Output: 1 5 2 4 3

Input: N = 8
Output: 7 2 1 8 3 6 4 5

Approach: Create an array of N elements and initialize the elements as 1, 2, 3, 4, …, N then shuffle the array elements using Fisher-Yates shuffle Algorithm.

Fisher–Yates shuffle Algorithm works in O(n) time complexity. The assumption here is, we are given a function rand() that generates a random number in O(1) time.

The idea is to start from the last element, swap it with a randomly selected element from the whole array (including last). Now consider the array from 0 to n-2 (size reduced by 1), and repeat the process till we hit the first element.

Below is the implementation of the above approach:

C++

 // C++ implementation of the approach #include using namespace std;   // Function to return the next random number int getNum(vector& v) {       // Size of the vector     int n = v.size();       // Generate a random number     srand(time(NULL));       // Make sure the number is within     // the index range     int index = rand() % n;       // Get random number from the vector     int num = v[index];       // Remove the number from the vector     swap(v[index], v[n - 1]);     v.pop_back();       // Return the removed number     return num; }   // Function to generate n non-repeating random numbers void generateRandom(int n) {     vector v(n);       // Fill the vector with the values     // 1, 2, 3, ..., n     for (int i = 0; i < n; i++)         v[i] = i + 1;       // While vector has elements     // get a random number from the vector and print it     while (v.size()) {         cout << getNum(v) << " ";     } }   // Driver code int main() {     int n = 8;     generateRandom(n);       return 0; }

Java

 // Java implementation of the approach import java.util.*; import java.lang.Math;   class GfG {       // Function to return the next random number     static int getNum(ArrayList v)     {         // Size of the vector         int n = v.size();               // Make sure the number is within         // the index range         int index = (int)(Math.random() * n);               // Get random number from the vector         int num = v.get(index);               // Remove the number from the vector         v.set(index, v.get(n - 1));         v.remove(n - 1);               // Return the removed number         return num;     }           // Function to generate n     // non-repeating random numbers     static void generateRandom(int n)     {         ArrayList v = new ArrayList<>(n);               // Fill the vector with the values         // 1, 2, 3, ..., n         for (int i = 0; i < n; i++)             v.add(i + 1);               // While vector has elements         // get a random number from the vector and print it         while (v.size() > 0)         {             System.out.print(getNum(v) + " ");         }     }       // Driver code     public static void main(String []args)     {                   int n = 8;         generateRandom(n);     } }   // This code is contributed by Rituraj Jain

Python3

 # Python3 implementation of the approach   # import random module import random   # Function to return the next # random number def getNum(v) :       # Size of the vector     n = len(v)       # Generate a random number within     # the index range     index = random.randint(0, n - 1)       # Get random number from the vector     num = v[index]       # Remove the number from the vector     v[index], v[n - 1] = v[n - 1], v[index]     v.pop()       # Return the removed number     return num   # Function to generate n non-repeating # random numbers def generateRandom(n) :           v =  * n       # Fill the vector with the values     # 1, 2, 3, ..., n     for i in range(n) :         v[i] = i + 1       # While vector has elements get a      # random number from the vector     # and print it     while (len(v)) :         print(getNum(v), end = " ")   # Driver code if __name__ == "__main__" :           n = 8     generateRandom(n)       # This code is contributed by Ryuga

C#

 // C# implementation of the approach using System; using System.Collections;   class GfG{    // Function to return the next random number static int getNum(ArrayList v) {           // Size of the vector     int n = v.Count;           Random rand = new Random();           // Make sure the number is within     // the index range     int index = (rand.Next() % n);        // Get random number from the vector     int num = (int)v[index];        // Remove the number from the vector     v[index] = (int)v[n - 1];     v.Remove(v[n - 1]);        // Return the removed number     return num; }    // Function to generate n // non-repeating random numbers static void generateRandom(int n) {     ArrayList v = new ArrayList(n);           // Fill the vector with the values     // 1, 2, 3, ..., n     for(int i = 0; i < n; i++)         v.Add(i + 1);        // While vector has elements get a     // random number from the vector     // and print it     while (v.Count > 0)     {         Console.Write(getNum(v) + " ");     } }   // Driver code public static void Main(string []args) {     int n = 8;           generateRandom(n); } }   // This code is contributed by rutvik_56



Javascript



Output:

3 4 5 8 6 2 1 7

Want to learn from the best curated videos and practice problems, check out the C++ Foundation Course for Basic to Advanced C++ and C++ STL Course for the language and STL. To complete your preparation from learning a language to DS Algo and many more, please refer Complete Interview Preparation Course.

My Personal Notes arrow_drop_up
Recommended Articles
Page :