【问题标题】:How can I randomize numbers in an array [duplicate]如何随机化数组中的数字[重复]
【发布时间】:2011-08-17 10:05:05
【问题描述】:

我有一个这样的数组:

int[] numbers = new [] { 1, 2, 3, 4 };

我想对此进行随机化(每次都不同),以便它生成另一个具有相同大小和数字但每次顺序不同的数组。

【问题讨论】:

  • 您找不到简单的方法来做到这一点,因为您要求的是两个完全相反的东西。 “随机”和“每次不同的顺序”是相反的。如果过程是随机,那么您应该期待重复。如果你掷骰子的次数足够多,即使结果是随机的,你也希望看到重复。你需要更清楚地指定你真正想要什么。一旦你编写了一个清晰、正确的规范,那么找到一个实现就会变得容易得多。
  • 我认为@Eric 还暗示的是,不清楚您是需要随机性还是只是想遍历数组的所有排列。
  • @Michael:没错。需要什么(1)只是数组的单个随机排列,或(2)数组的随机排列的随机序列,或(3)所有可能排列的序列的随机排序?所有这三个都是不同的,就目前的问题而言,需要哪个是令人困惑的。
  • 这个问题在网上被问了多少次了?提问的时候一定有过相关的问题建议。

标签: c# arrays random numbers


【解决方案1】:

试试这样的:

System.Random rnd = new System.Random();
var numbers = Enumerable.Range(1, 4).OrderBy(r => rnd.Next()).ToArray();

【讨论】:

  • 太好了,非常感谢。
  • var numbers = Enumerable.Range(1, 4).OrderBy(r => rnd.Next(1,4)).ToArray();
  • 我们还需要在rnd.Next(min,max) 中添加1,4 吗?理想情况下,我们需要告诉我们需要在 rnd.Next(min,max) 中使用 min 和 max 范围进行排序。为什么您的解决方案在不给rnd 提供任何范围的情况下有效,请解释一下
【解决方案2】:

这是一个可行的方法:

public List<int> Randomize(int[] numbers)
{
    List<int> randomized = new List<int>();
    List<int> original = new List<int>(numbers);
    Random r = new Random();
    while (original.Count > 0) {
        int index = r.Next(original.Count);
        randomized.Add(original[index]);
        original.RemoveAt(index);
    }

    return randomized;
}

编辑:

另一种方法是使用IEnumerable&lt;T&gt; 集合的 LINQ 扩展方法:

var random = new Random();
List<int> randomized = numbers.OrderBy(x => random.Next()).ToList();

如果您想要一个数组而不是 List&lt;int&gt;,您可以调用 .ToArray()

当然,这适用于int 的任何数组,而不仅仅是1, 2, 3, ..., n。您甚至可以在 T 中将方法设为泛型。

【讨论】:

  • 这被称为“Knuth Shuffle”,也可以就地完成。
  • 糟糕,我说得太早了。您的方法类似但效率非常低:O(n ^ 2)。你需要试试“Knuth Shuffle”!
  • @RickSladkey 是的,我就是这么想的。我正在阅读 Jeff 的文章:codinghorror.com/blog/2007/12/the-danger-of-naivete.html
【解决方案3】:

这甚至注意值不重复;

for(int i=0;i<4;i++)
{
  int no_repeat = -1;

  int x,j;

  while(no_repeat!=1)
  {
    x=rand()%4;
    for(j=0;j<4;j++)
    {
      if(numbers[j]==x)
        break;
    }

    if(j==4)
      no_repeat=1;


  }

  if(no_repeat)
  numbers[i]=x;
}

【讨论】:

    【解决方案4】:

    有效:

    numbers = numbers.OrderBy(s => Guid.NewGuid()).ToArray();
    

    【讨论】:

      【解决方案5】:

      在我看来,最简单的方法是:

       int[] grid = new int[9];//size of array
      
              Random randomNumber = new Random();//new random number
              var rowLength = grid.GetLength(0);
              var colLength = grid.GetLength(1);
              for (int row = 0; row < rowLength; row++)
              {
      
                      grid[col] = randomNumber.Next(4)+1;//Fills grid with numbers from
                                                              //1-4
                      Console.Write(String.Format("{0}\t", grid[col]));
                      //Displays array in console
      
                  Console.WriteLine();
              }
      

      【讨论】:

        【解决方案6】:
        public  static void Shuffle<T>(T[] array)
        {
            Random random = new Random();
        
            for (int i = 0; i < 10; i++)
            {
                int idx = random.Next(i, 10);
        
                //swap elements
                T tmp = array[i];
                array[i] = array[idx];
                array[idx] = tmp;
            }  
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-08-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-15
          • 1970-01-01
          • 1970-01-01
          • 2021-12-25
          相关资源
          最近更新 更多