【问题标题】:C# output different from breakpoint output [duplicate]C#输出不同于断点输出[重复]
【发布时间】:2015-12-05 20:12:02
【问题描述】:

一个函数将 24 个随机字符串从一个带有 for 循环的数组中输入到一个字符串列表中。另一个函数在控制台中显示列表中的字符串。但是,我只得到一个循环的值,例如 1111111111111111111111111。当我设置断点时,我得到了我正在寻找的输出,例如 12kingace342356110。这是我的函数类代码。

namespace CardWarConsoleGame
{
    class Deck
    {
        public string[] CardNames = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace" };
        public int[] CardValues = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 };
    }


    class WarFunctions
    {
        public static List<string> YourDeck = new List<string>();
        public static List<string> AIDeck = new List<string>();

        public static void LoadCards()
        {
            Deck deck = new Deck();
            for (int i = 0; i < 24; i++)
            {
                Random r = new Random();
                YourDeck.Add(deck.CardNames[r.Next(0, 14)]);
            }

        }

        public static void test()
        {
            for (int i = 0; i < YourDeck.Count; i++)
            {
                Console.Write(YourDeck[i]);
            }
        }
    }
}



Heres the program.cs

namespace CardWarConsoleGame
{
    class Program : WarFunctions
    {
        static void Main(string[] args)
        {
            LoadCards();
            test();
            Console.ReadLine();
        }
    }
}

【问题讨论】:

    标签: c# output


    【解决方案1】:

    您应该在循环之前创建Random

    public static void LoadCards()
    {
        Deck deck = new Deck();
        Random r = new Random();
        for (int i = 0; i < 24; i++)
        {
            YourDeck.Add(deck.CardNames[r.Next(0, 14)]);
        }
    }
    

    Randomdefault constructor

    使用与时间相关的默认种子值初始化 Random 类的新实例。

    默认种子值来自系统时钟并且具有有限的分辨率。因此,通过调用默认构造函数连续创建的不同 Random 对象将具有相同的默认种子值,因此将产生相同的随机数集。

    【讨论】:

      【解决方案2】:
       public static void LoadCards()
       {
           Deck deck = new Deck();
           for (int i = 0; i < 24; i++)
           {
               Random r = new Random();
               YourDeck.Add(deck.CardNames[r.Next(0, 14)]);
           }
        }
      

      您的 Random 类不应在 foreach 循环中创建。如果您在 foreach 循环中继续初始化随机数,当它自己播种以产生随机数时,您会根据系统时钟的时间继续启动该序列。如果将它放在 foreach 循环之外,它将保持其初始种子数据并生成数字,而不会重新播种回第一个。

      所以你的代码应该是这样的:

       public static void LoadCards()
       {
           //Random initialized outside of the foreach loop
           Random r = new Random();
           Deck deck = new Deck();
           for (int i = 0; i < 24; i++)
           {
               YourDeck.Add(deck.CardNames[r.Next(0, 14)]);
           }
        }
      

      default constructor 上的文档,用于 Random。

      【讨论】:

        【解决方案3】:

        Check this link. They describe it beautifully 问题是您创建 Random 类的实例的时间太近了。

        当您创建一个 Random 对象时,它会使用来自系统时钟的值作为种子。如果您创建 Random 实例的时间太接近,它们都将使用相同的随机序列播种。

        当您创建“a”类的实例时,创建一个 Random 对象并将其引用传递给构造函数,而不是为每个“a”实例创建一个 Random 对象。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-10-27
          • 1970-01-01
          • 1970-01-01
          • 2011-07-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-15
          相关资源
          最近更新 更多