随机排列n个连续整数

wil*_*007 3 c# algorithm

可能重复:
使用Random和OrderBy是一个很好的shuffle算法吗?

给定从0开始的n个连续数的整数数组,即

0,1,2,..n
Run Code Online (Sandbox Code Playgroud)

我希望随机生成一个数字的排列,

说给定

0,1,2,3
Run Code Online (Sandbox Code Playgroud)

一个可能的是 3,1,2,0

如何轻松实现?

dar*_*yal 10

首先创建一个所需大小的整数数组,并用增加的连续数字填充它;

int n = 10;
int[] array = new int[n + 1];
for (int i = 0; i <= n; i++)
{
    array[i] = i;
}
Shuffle(array);
Run Code Online (Sandbox Code Playgroud)

你可以使用Knuth/Fisher-Yates shuffle

/// <summary>
/// Knuth shuffle
/// </summary>        
public void Shuffle(int[] array)
{
    Random random = new Random();
    int n = array.Count();
    while (n > 1)
    {
        n--;
        int i = random.Next(n + 1);
        int temp = array[i];
        array[i] = array[n];
        array[n] = temp;
    }
}
Run Code Online (Sandbox Code Playgroud)


fit*_*ito 8

这是一个使用LINQ和随机生成器的简单方法.

int[] numbers = new int[] { 1,2,3,4,5,6,7,8,9 };

Random rnd = new Random();
int[] MyRandomNumbers = numbers.OrderBy(x => rnd.Next()).ToArray();
Run Code Online (Sandbox Code Playgroud)

参考:使用.NET随机化数组的最佳方法

  • 这不是精确的随机排列,因为rnd.Next()返回相同数字的可能性很小.当发生这种情况时,你选择第一个元素.这意味着第一个元素首先出现的概率略大于实际随机排列. (2认同)