【问题标题】:How do I order the digits 1-10 randomly into an array and then call each part of the array one at a time?如何将数字 1-10 随机排序到一个数组中,然后一次调用数组的每个部分?
【发布时间】:2014-03-22 13:33:41
【问题描述】:

所以基本上,我需要在启动时将数字 1-10 随机排序到一个数组中,并且在表单加载时,它应该加载第一个数字。每次用户单击一个按钮时,它都会加载与下一个数字相关的信息。 这是我的代码,但由于某种原因,它会生成一个很多不是整数的数字。

Random rng = new Random(10);
int[] QuestionOrder = new int[10];

for (int i = 0; i < QuestionOrder.Length; i++)
{
    int temp = rng.Next(1,10);
    while(!(QuestionOrder.Contains(temp)))
    {
        QuestionOrder[i] = temp;
    }
}

每次它生成一个数字 1 - 10 并检查它是否已经存储在数组中,如果没有,则存储它并再次运行。

由于某种原因,它生成的数字不是整数 1 - 10,我不知道为什么。

【问题讨论】:

  • 你得到的数字是多少?您是否尝试过放置一些断点并单步执行代码以查看会发生什么?请先尝试自己调试代码,然后询问(或搜索)您遇到的问题的解决方案。
  • 另请阅读散列集
  • 欢迎来到 Stack Overflow!请不要包含有关问题标题中使用的语言的信息,除非没有它就没有意义。标记用于此目的。

标签: c# arrays random


【解决方案1】:

我认为您需要在while 循环中覆盖temp 的值,并将您的范围更改为1-11 而不是1-10,并在循环前使用if 语句:

int temp = rng.Next(1, 11);
if(!QuestionOrder.Contains(temp)) QuestionOrder[i] = temp;
else 
{
    while(QuestionOrder.Contains(temp))
    {
       temp = rng.Next(1, 11);
       QuestionOrder[i] = temp;
    }
}

【讨论】:

    【解决方案2】:

    你可以先生成十个随机数,然后遍历它们。

    var rnd = new Random(Environment.TickCount);
    var arr = Enumerable.Range(1,10).OrderBy(x => rnd.Next()).ToArray();
    

    【讨论】:

      【解决方案3】:

      这确实很好用

          static void Main(string[] args)
          {
              Random random = new Random();
      
              var range = Enumerable.Range(1, 10).ToList();
              int[] rnd = new int[10];
      
              int j = 0;
              do
              {
                  int i = random.Next(0, range.Count);
                  rnd[j++] = range[i];
                  range.RemoveAt(i);
              }
              while(range.Count > 1);
      
              rnd[j] = range[0];
          }
      

      比在循环中使用包含更少的 CPU 密集度

      【讨论】:

        【解决方案4】:

        首先,您的种子始终相同。要么省略它,要么使用当前日期。 其次,您正在生成 1 到 9 之间的数字,因此您永远不会得到 10,并且您的数组单元之一将保持为空。 换temp = rng.Next(1, 11);

        【讨论】:

          【解决方案5】:

          正如其他人指出的那样,当生成的数字已经存在于列表中时,您不会重新生成新数字,而是在结果中留下各种默认值 0

          但是有更好的方法来“打乱”数字列表,请参阅Randomize a List in C#

          public static IList<T> Shuffle<T>(this IList<T> list)
          {
              Random rng = new Random();
              int n = list.Count;
              while (n > 1)
              {
                  n--;
                  int k = rng.Next(n + 1);
                  T value = list[k];
                  list[k] = list[n];
                  list[n] = value;
              }
          
              return list;
          }
          

          你可以这样称呼:

          IList<int> QuestionOrder = Enumerable.Range(1, 10)
                                               .ToList()
                                               .Shuffle();
          

          【讨论】:

            【解决方案6】:

            打乱数组的最佳算法是Knuth-Fisher-Yates,可以如下实现:

            public static class Extensions
            {
                public static void Shuffle<T>(this IList<T> list, Random rand)
                {
                   for (int i = list.Count - 1; i > 0; i--)
                   {
                       int n = rand.Next(i + 1);
                       int tmp = list[i];
                       list[i] = list[n];
                       list[n] = tmp;
                   }
                }
            }
            

            用法:

            // to get different random sequences every time, just remove the seed (1234)
            Random rng = new Random(1234); 
            // create an array containing 1,2...9,10
            int[] questionOrder = Enumerable.Range(1,10).ToArray();
            // shuffle the array
            questionOrder.Shuffle(rand);
            

            旁注:

            要了解为什么 Knuth-Fisher-Yates 算法比简单的实现更好,请阅读Jeff 的这篇有趣的帖子

            【讨论】:

            • 您应该从随机数中删除种子,使其在运行时成为实际随机数:-)
            猜你喜欢
            • 2021-08-23
            • 1970-01-01
            • 2015-01-06
            • 2018-03-24
            • 2017-10-30
            • 2020-10-22
            • 2022-10-23
            • 1970-01-01
            • 2014-03-10
            相关资源
            最近更新 更多