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 Black ではなく Black White を印刷します。現在、現在をダンプして再度呼び出す代わりに、まったく同じことを何度も出力します(これは、ループが行ったと私が思っていたことです>.<)何か提案はありますか?

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 のインスタンスを作成します。

こちらです

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時間が近すぎます。それらはクロックからシードされるため、すべて同じ番号で開始されます。関数の外側に 1 つのインスタンスを作成し、それを呼び出して送信します。

また、毎回新しいリストを作成しているため、リストから項目を削除しても効果はありません。関数の外でリストを作成します。

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 に答える