在课堂上随机“重置”

本文关键字:重置 随机 课堂 | 更新日期: 2023-09-27 18:36:34

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

现在我的问题是,有没有办法在执行过程中重置它(更新/修改种子)或类似的东西,这样我就不必创建 x 数量的 int(在我的情况下)来保存随机数?

例如:每次使用我的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函数,这意味着你显然重用了同一个存储的 off 变量。要获得不同的号码,您需要重新调用 Next

解决繁琐地创建变量并每次编写相同的调用Next的一种方法是将其存储为委托

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 关于随机的文章。

以下是您可能需要考虑的替代方法:

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

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