C#输出与断点输出不同

本文关键字:输出 断点 | 更新日期: 2023-09-27 18:25:44

一个函数从一个带有for循环的数组中向字符串列表中输入24个随机字符串。另一个函数显示控制台中列表中的字符串。然而,我只得到一个循环的值,例如1111111111111111111。当我设置断点时,我会得到我想要的输出,比如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#输出与断点输出不同

您应该在循环之前创建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)]);
    }
}

Random 的默认构造函数

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

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

 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)]);
     }
  }

关于Random默认构造函数的文档。

检查此链接。他们把它描述得很漂亮问题是创建Random类的实例的时间太近。

创建随机对象时,会使用系统时钟中的值对其进行种子设定。如果创建的"随机"实例在时间上过于接近,则它们都将使用相同的随机序列进行种子设定。

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