"Reset" 随机 class

"Reset" random in class

所以任务是制作一个程序,使用枚举选择三个不同的胸件(颜色 + 件)。我制作了一个 Random 对象的实例,但当然这在整个代码执行过程中给出了相同的数字,因为我只初始化了一个包含随机数的 int。

现在我的问题是,有没有什么方法可以在执行期间重置它(update/modify 种子)或类似的东西,这样我就不必创建 x 数量的 int(在我的例子中) 来保存随机数?

例如:每次使用我的智力胸甲时,它都会自行恢复。

这可能吗,还是我必须创建几个棋子 int(在我的情况下)才能解决这个问题。

        private static void Main()
    {
        int chesspiece = Rand.Next(1, sizeof (EnumChestPiece) + 1);
        int color = Rand.Next(1, sizeof (EnumColor) + 1);

        EnumChestPiece firstPiece = (EnumChestPiece) chesspiece;
        EnumChestPiece secondPiece = (EnumChestPiece) chesspiece;
        EnumChestPiece thirdPiece = (EnumChestPiece) chesspiece;

        EnumColor firstColor = (EnumColor) color;
        EnumColor secondColor = (EnumColor) color;
        EnumColor thirdColor = (EnumColor) color;

        Console.WriteLine("{0} {1}", firstColor, firstPiece);
        Console.WriteLine("{0} {1}", secondColor, secondPiece);
        Console.WriteLine("{0} {1}", thirdColor, thirdPiece);
    }

    private enum EnumChestPiece
    {
        Pawn,
        Knight,
        Bishop,
        Rook,
        King,
        Queen
    }

    private enum EnumColor
    {
        Black,
        White
    }

您没有使用相同的种子,您只调用 Next 函数一次,这意味着您显然重复使用了相同的存储关闭变量。要获得不同的号码,您需要重新调用 Next.

绕过乏味地创建变量并每次都对 Next 编写相同调用的一种方法是将其存储为 delegate 而不是:

Func<int> chesspiece = (() => 
      Rand.Next(1, Enum.GetNames(typeof(EnumChessPiece)).Length; + 1));
//Or even, credit to @Jacob
Func<EnumChessPiece> chesspiece = (() => 
     (EnumChestPiece)Rand.Next(1, Enum.GetNames(typeof(EnumChessPiece)).Length + 1));

现在您可以在每次需要随机数时调用它,如下所示:

//Notice that I'm invoking the delegate
EnumChestPiece firstPiece = (EnumChestPiece) chesspiece();
//Or in @Jacob's variant
EnumChestPiece firstPiece = chesspiece();

您当然可以使用命名方法同样轻松地完成此操作,但此语法与您想要的非常相似。

您正在将 Rand 生成的随机数分配给每个 int,然后使用这些变量。您没有分配生成随机数的功能。 Rand.Next() 每次都必须调用以获得新的随机数。此外,为了获得最佳性能,您应该创建一个 Random 的实例,使用它来生成随机数:

Random myRandom = new Random();

EnumChestPiece firstPiece = (EnumChestPiece) myRandom.Next(1, sizeof (EnumChestPiece) + 1);
EnumChestPiece secondPiece = (EnumChestPiece) myRandom.Next(1, sizeof (EnumChestPiece) + 1);
EnumChestPiece thirdPiece = (EnumChestPiece) myRandom.Next(1, sizeof (EnumChestPiece) + 1);

EnumColor firstColor = (EnumColor) myRandom.Next(1, sizeof (EnumColor) + 1);
EnumColor secondColor = (EnumColor) myRandom.Next(1, sizeof (EnumColor) + 1);
EnumColor thirdColor = (EnumColor) myRandom.Next(1, sizeof (EnumColor) + 1);

还要记住,随机数只是伪随机数;这意味着它们不会是真正随机的,但在大多数情况下它们应该足够随机。

另见 MSDN article on Random

您可以考虑以下替代方法:

var rnd = new Random();

var pieces =
    from p in Enum.GetValues(typeof(EnumChestPiece)).Cast<EnumChestPiece>()
    from c in Enum.GetValues(typeof(EnumColor)).Cast<EnumColor>()
    orderby rnd.Next()
    select new
    {
        Piece = p,
        Color = c,
    };

foreach (var p in pieces.Take(3))
{
    Console.WriteLine("{0} {1}", p.Color, p.Piece);
}

这种方法的优点是它确保您不会得到重复的片段。