"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);
还要记住,随机数只是伪随机数;这意味着它们不会是真正随机的,但在大多数情况下它们应该足够随机。
您可以考虑以下替代方法:
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);
}
这种方法的优点是它确保您不会得到重复的片段。
所以任务是制作一个程序,使用枚举选择三个不同的胸件(颜色 + 件)。我制作了一个 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);
还要记住,随机数只是伪随机数;这意味着它们不会是真正随机的,但在大多数情况下它们应该足够随机。
您可以考虑以下替代方法:
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);
}
这种方法的优点是它确保您不会得到重复的片段。