好的,我想打电话给
for (int i = 0; i < b; b--)
{
color += ChooseColor() + " ";
}
重要的是它被多次调用。我的ChooseColors()是
private static string ChooseColor()
{
Random random = new Random();
var colors = new List<string> { "Blue", "Red", "Green", "Indigo", "Black", "White", "Violet", "Turquoise", "Pink", "Lavender", "Cinder", "Fuschia", "Orange" };
int index = random.Next(colors.Count);
string colorName = colors[index];
colors.RemoveAt(index);
return colorName;
}
问题是,我希望它每次都调用一个新的ChooseColor实例。例如,它会打印黑色白色而不是黑色黑色。现在它反复打印完全相同的东西,而不是转储当前和再次调用(这是我认为循环做的&gt;。&lt;)任何建议?
答案 0 :(得分:2)
数组在方法中声明,因此当您再次调用该方法时,它会重新声明并重新填充。您必须在方法之外静态声明颜色列表。
此外,随机化器在每次方法调用时再次初始化 - 也只是在方法之外初始化一次随机化器。
private static Random random = new Random();
private static List<string> colors = new List<string> { ... };
private static string ChooseColor()
{
if (colors.Count > 0)
{
int index = random.Next(colors.Count);
string colorName = colors[index];
colors.RemoveAt(index);
return colorName;
}
return String.Empty;
}
请注意,此方法在调用时返回一个空字符串,颜色列表中没有剩余颜色。我认为除了修复随机发生器问题之外,你应该重新考虑设计(特别是为什么必须从列表中删除颜色)。
答案 1 :(得分:1)
在这种情况下,创建Random class static的实例。
这样
static Random random = new Random(); // Global Declaration
private static string ChooseColor()
{
var colors = new List<string> { "Blue", "Red", "Green", "Indigo", "Black", "White", "Violet", "Turquoise", "Pink", "Lavender", "Cinder", "Fuschia", "Orange" };
int index = random.Next(colors.Count);
string colorName = colors[index];
colors.RemoveAt(index);
return colorName;
}
欲了解更多信息,请阅读
答案 2 :(得分:1)
您创建Random
个实例的时间太近了。由于它们是从时钟播种的,它们都将以相同的数字开始。在函数外部创建一个实例,并将其发送给您调用它。
此外,您每次都在创建一个新列表,因此从列表中删除项目无效。在函数外部创建列表:
Random random = new Random();
List<string> colors = new List<string> { "Blue", "Red", "Green", "Indigo", "Black", "White", "Violet", "Turquoise", "Pink", "Lavender", "Cinder", "Fuschia", "Orange" };
for (int i = 0; i < b; b--) {
color += ChooseColor(colors, random) + " ";
}
private static string ChooseColor(List<string> colors, Random random) {
int index = random.Next(colors.Count);
string colorName = colors[index];
colors.RemoveAt(index);
return colorName;
}