以随机顺序显示整数数组,而不使用shuffle

时间:2014-01-30 13:36:28

标签: c#

        int n;

        Console.WriteLine("Please enter a positive integer for the array size"); // asking the user for the int n

        n = Int32.Parse(Console.ReadLine());

        int[] array = new int[n]; // declaring the array
        int[] newarray = new int[n];
        Random rand = new Random();
        for (int i = 0; i < array.Length; i++)
        {
            array[i] = i + 1;
        }
        for (int y = 0; y < newarray.Length; y++)
        {
            int caseSwitch = 1;
            switch (caseSwitch)
            {
                case 1:
                    newarray[y] = array[rand.Next(n)];
                    goto case 2;
                case 2:
                    for (int z = y+1; z > 0; z--)
                    {
                        if (newarray[y] == newarray[z-1])
                            goto case 1;
                    }
                    break;
            }
        }
        for (int x=0;x<newarray.Length;x++)
        {
            Console.Write(" {0}", newarray[x]);
        }
        Console.ReadLine();

这是我开始使用的代码,但它没有显示任何值,是不是填充了数组?我是新手,所以任何帮助都会非常感激

8 个答案:

答案 0 :(得分:1)

我认为你的方法非常复杂。你应该退后一步,想想你想要完成什么,先做好计划,然后开始编程。

您要做的是使用随机排序顺序对数组进行排序。

创建一个随机返回比较的新IComparer

public class RandomComparer<T> : IComparer<T> {
    private static Random random = new Random();

    public int Compare(T a, T b) {
        return random.Next(2) == 0 ? 1 : -1;
    }
}

现在,对你的数组进行排序:

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

Array.Sort<int>(array, new RandomComparer<int>());

for (int i = 0; i < array.Length; i++)
    Console.WriteLine(array[i]);

真的那么简单。请参阅IDEOne.com

上的演示

答案 1 :(得分:0)

你可以这样做:

...

n = Int32.Parse(Console.ReadLine());

// Initial array filled with 1..n values
int[] data = Enumerable.Range(1, n).ToArray(); 
// data array indice to show, initially 0..n-1
List<int> indice = Enumerable.Range(0, n - 1).ToList(); 

Random gen = new Random();

for (int i = 0; i < n; ++i) {
  if (i != 0)
    Console.Write(' ');

  index = gen.Next(indice.Count);

  Console.Write(data[indice[index]]);
  // Index has been shown, let's remove it since we're not going to show it again 
  indice.RemoveAt(index);
}    

...

答案 2 :(得分:0)

似乎陷入无限循环。尝试更改此位:

        case 2:
                for (int z = y; z > 0; z--)
                {
                    if (newarray[y] == newarray[z-1])
                        goto case 1;
                }
                break;

答案 3 :(得分:0)

您没有看到任何输出的原因是因为代码没有运行完成 - 它最终在案例1和2之间反弹,因为

if (newarray[y] == newarray[z - 1])

总是如此。

我的建议是调试(即逐步执行)您的代码,这样您就可以真正理解为什么会这样,那么您将能够自己修复代码:)

答案 4 :(得分:0)

您要做的是生成随机排列。您可以尝试以下方法:

var rand = new Random();
var left = Enumerable.Range(1, n).ToList();
for(int i=0; i<n; ++i)
{
   int j = rand.Next(n-i);
   Console.Out.WriteLine(left[j]);
   left[j].RemoveAt(j);
}

答案 5 :(得分:0)

使用随机比较这是最简单的方法。

class Program
{
    static Random rnd=new Random();
    static void Main(string[] args)
    {
        int[] array= { 1, 2, 3, 4, 5, 6 };
        int[] newarray=new int[array.Length];
        array.CopyTo(newarray, 0);
        Array.Sort(newarray, (i, j) => rnd.NextDouble()<0.5?-1:1);            
        // newarray is now randomly ordered
    }
}

答案 6 :(得分:-1)

您可以随意切换值:

int n;
Console.WriteLine("Please enter a positive integer for the array size"); // asking the user for the int n
n = Int32.Parse(Console.ReadLine());

int[] array = new int[n]; // declaring the array
int[] newarray = new int[n];
Random rand = new Random();
for (int i = 0; i < array.Length; i++)
{
    array[i] = i + 1;
    newarray[i] = i + 1;
}
for (int y = 0; y < newarray.Length; y++)
{
    int r = rand.Next(n);
    int tmp = newarray[y];
    newarray[y] = newarray[r];
    newarray[r] = tmp;
}

for (int x=0;x<newarray.Length;x++)
{
    Console.Write(" {0}", newarray[x]);
}
Console.ReadLine();

答案 7 :(得分:-1)

使用以下代码

   int[] array = new int[n];
        int[] randomPosition = new int[n];
        Enumerable.Range(0, n ).ToList().ForEach(o => array[o] = o+1);
        Random r = new Random();
        Enumerable.Range(0, n).ToList().ForEach(o => randomPosition[o] = r.Next(0, n - 1));
        foreach (var m in randomPosition)
        {
          var randomNumber =   array[m];
          //write randomnumber
        }