【问题标题】:How to make this code work without repeating the numbers? [duplicate]如何在不重复数字的情况下使此代码工作? [复制]
【发布时间】:2013-10-04 10:11:30
【问题描述】:

我需要以随机顺序打印从 1 到 50 的数字而不重复 它。

static void Main(string[] args)
{
     ArrayList r = new ArrayList();

     Random ran = new Random();      
     for (int i = 0; i < 50; i++)
     {
        r.Add(ran.Next(1,51));

     }

     for (int i = 0; i < 50; i++)
        Console.WriteLine(r[i]);
     Console.ReadKey();
}

【问题讨论】:

标签: c# random arraylist


【解决方案1】:

你想要的是Fisher Yates Shuffle

这是Jeff Atwood实现的算法

cards = Enumerable.Range(1, 50).ToList();
for (int i = cards.Count - 1; i > 0; i--)
{
  int n = ran.Next(i + 1);
  int temp = cards[i];
  cards[i] = cards[n];
  cards[n] = temp;
}

【讨论】:

    【解决方案2】:

    如果您不想重复 1 到 50 之间的数字,最好的办法是用数字 1 到 50 填充一个列表,然后随机播放内容。这里有一篇关于洗牌的好帖子: Randomize a List<T>

    【讨论】:

      【解决方案3】:

      您需要做的就是检查该号码是否已存在于列表中,如果存在则获取另一个:

      static void Main(string[] args)
      {
          ArrayList r = new ArrayList();
      
          Random ran = new Random();      
          int num = 0;
      
          for (int i = 0; i < 50; i++)
          {
              do { num = ran.Next(1, 51); } while (r.Contains(num));
              r.Add(num);
          }
      
          for (int i = 0; i < 50; i++)
             Console.WriteLine(r[i]);
      
          Console.ReadKey();
      }
      

      编辑:这将大大提高效率,防止长时间暂停等待非冲突数字:

          static void Main(string[] args)
          {
              List<int> numbers = new List<int>();
      
              Random ran = new Random();
              int number = 0;
              int min = 1;
              int max = 51;
      
              for (int i = 0; i < 50; i++)
              {
                  do
                  {
                      number = ran.Next(min, max);
                  }
                  while (numbers.Contains(number));
      
                  numbers.Add(number);
      
                  if (number == min) min++;
                  if (number == max - 1) max--;
              }
      
              for (int i = 0; i < 50; i++)
                  Console.WriteLine(numbers[i]);
      
              Console.ReadKey();
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-02
        • 2019-10-23
        • 1970-01-01
        • 1970-01-01
        • 2018-05-26
        • 1970-01-01
        • 1970-01-01
        • 2010-10-18
        相关资源
        最近更新 更多