在课堂上随机“重置”

时间:2015-01-06 23:47:42

标签: c# random

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

现在我的问题是,你有什么方法可以在执行期间重置它(更新/修改种子)或类似的东西,所以我不必创建x量的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
    }

3 个答案:

答案 0 :(得分:3)

您没有使用相同的种子,您只需调用 Next函数一次,这意味着您显然会重复使用相同的存储关闭变量。要获得不同的数字,您需要重新调用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();

您当然可以使用命名方法轻松完成此操作,但此语法非常类似于您的目标。

答案 1 :(得分:0)

您要将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

答案 2 :(得分:0)

这是您可能需要考虑的另一种方法:

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

这种方法的优势在于它可以确保您不会获得重复的部分。