给定整数N ,任务是生成N个非重复的随机数。
例子:
Input: N = 5
Output: 1 5 2 4 3
Input: N = 8
Output: 7 2 1 8 3 6 4 5
方法:创建一个由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等的更多准备工作,请参阅“完整面试准备课程” 。