//一般来说,我从Enum中获取随机颜色并将其插入到新数组中。 当我在循环中通过BoxMessage询问时对于每个Array [i]我得到了预期的随机颜色。 如果我评论(\)消息框并在循环外询问数组[1-5],我得到所有5个消息框的相同颜色。 我相信这与我在循环中的消息框成功将Enum转换为字符串这一事实有关,当我试图在循环中转换整个数组时(array [i] .ToString();)它没有完全奏效。 请指教....
public void GetArray()
{
array = new EnumColor[5];
for (int i = 0; i < 5; i++)
{
rnd = new Random();
int rndnum = rnd.Next(0, 4);
array[i] = (EnumColor)rndnum;
MessageBox.Show(array[i].ToString());
}
MessageBox.Show(array[0].ToString());
MessageBox.Show(array[1].ToString());
MessageBox.Show(array[2].ToString());
MessageBox.Show(array[3].ToString());
MessageBox.Show(array[4].ToString());
}
答案 0 :(得分:1)
您获得相同的颜色,因为您每次在循环中声明random
实例,只需将声明移到外面:
rnd = new Random();
for (int i = 0; i < 5; i++)
{ ... }
如果您想详细了解Random
课程为何如此有效,您可以查看this answer。
答案 1 :(得分:1)
for (int i = 0; i < 5; i++)
{
rnd = new Random();
int rndnum = rnd.Next(0, 4);
array[i] = (EnumColor)rndnum;
MessageBox.Show(array[i].ToString());
}
你要覆盖数组中的元素,不要这样做。
将元素转换为临时局部变量(并使用.Length
而不是硬编码长度)
错误本身是由于Random
被错误播种引起的,它在每次迭代时都被重新生成。
Random rnd = new Random();
for (int i = 0; i < array.Length; i++)
{
int rndnum = rnd.Next(0, 4);
EnumColor selected = (EnumColor)array[i];
MessageBox.Show( selected .ToString() );
}
答案 2 :(得分:0)
问题确实是为每个循环重新创建Random。但是这里有完整的解释。
创建Random时,它使用Environment.TickCount作为种子值。 (自系统启动以来的毫秒数)。因此,如果你的循环足够快,它将始终是相同的值,因此rnd.Next函数将始终返回相同的值。
所以现在对于棘手的部分..为什么它与循环内的消息框一起工作?通过显示消息,等待单击“确定”按钮,循环变慢。因此下一个循环,种子确实改变了。这就是你获得另一个价值的原因。