0

好的,所以我想打电话

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 实例。例如,它将打印 Black White 而不是 Black Black。现在它一遍又一遍地打印完全相同的东西,而不是转储电流并再次调用(这是我认为循环所做的>.<)有什么建议吗?

4

3 回答 3

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

请注意,当调用此方法时,现在在颜色列表中没有剩余颜色时会返回一个空字符串。我认为除了解决随机化器问题之外,您还应该重新考虑设计(尤其是为什么有必要从列表中删除颜色)。

于 2012-11-23T08:08:59.673 回答
1

在这种情况下,创建 Random 类静态的实例。

这边走

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

有关更多信息,请阅读此

生成的随机数总是相等的

于 2012-11-23T08:08:50.797 回答
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;
}
于 2012-11-23T08:14:46.067 回答