所以任务是制作一个程序,使用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
}
答案 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);
还记得随机数只是伪随机数;这意味着它们不是真正随机的,但在大多数情况下它们应该足够随机。
答案 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);
}
这种方法的优势在于它可以确保您不会获得重复的部分。