📜  产生1到N的随机排列

📅  最后修改于: 2021-05-31 17:11:59             🧑  作者: Mango

给定整数N ,任务是生成N个非重复的随机数。

例子:

方法:创建一个由N个元素组成的数组,并将元素初始化为1,2,3,4,…,N,然后使用Fisher-Yates混洗算法对数组元素进行混洗。

Fisher-Yates混洗算法的工作时间为O(n)。这里的假设是,给我们一个函数rand(),它在O(1)时间内生成随机数。

这个想法是从最后一个元素开始,将其与整个数组(包括最后一个)中随机选择的元素交换。现在考虑从0到n-2的数组(大小减小1),并重复该过程,直到我们找到第一个元素为止。

下面是上述方法的实现:

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 = [0] * 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


PHP


输出:
3 4 5 8 6 2 1 7
想要从精选的最佳视频中学习并解决问题,请查看有关从基础到高级C++的C++基础课程以及有关语言和STL的C++ STL课程。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”