1

10個の一意の乱数を生成するメソッドを作成しようとしていますが、番号が一意ではないため、いくつかの重複が発生します。どうすればコードを改善して希望どおりに機能させることができますか?

        int[] randomNumbers = new int[10];

        Random random = new Random();

        int index = 0;

        do
        {
            int randomNum = random.Next(0, 10);
            if (index == 0)
            {
                randomNumbers[0] = randomNum;
                index++;
            }

            else
            {
                for (int i = 0; i < randomNumbers.Length; i++)
                {
                    if (randomNumbers[i] == randomNum)
                        break;
                    else
                    {
                        randomNumbers[index] = randomNum;
                        index++;
                        break;
                    }
                }
            }
        }
        while (index <= 9);

foreach (int num in randomNumbers)
            System.Console.Write(num + " ");

編集2:すべてのエラーを修正しましたが、番号が一意ではないため、このコードは機能していません!上記のコードを最新バージョンに更新しました。私はこれを解決するためにいくつかの助けに感謝します!ありがとう!

4

3 に答える 3

7

これを行う最も簡単な方法は、必要な数値の配列(つまり、1〜10)を用意し、ランダムシャッフルアルゴリズムを使用することです。

フィッシャー-イェーツシャッフルは、これを行う最も簡単な方法です。

編集:

C#実装へのリンクは次のとおりです:http://www.dotnetperls.com/fisher-yates-shuffle

于 2012-08-16T12:54:09.537 に答える
2

random.next(0、10)は、0から10までの乱数を返します。同じ番号を連続して複数回返すことがありますが、0から10までのすべての数値を1回だけ取得することは保証されていません。 、10回呼び出すと。

必要なのは番号のリストです。すべての番号は0から9(または1から10)の間で一意です。これに対する可能な解決策は次のようなものです:

//Create the list of numbers you want
var list = new List<int>();
for(var x = 0; x < 10; x++)
{
    list.Add(x);
}

var random = new Random();
//Prepare randomized list
var randomizedList = new List<int>();
while(list.Length > 0)
{
    //Pick random index in the range of the ordered list
    var index = random.Next(0, list.Length);

    //Put the number from the random index in the randomized list
    randomizedList.Add(list[index]);

    //Remove the number from the original list
    list.RemoveAt(index);
}

言葉で説明すると、これはあなたがしていることです:

  1. 最終的なリストに含まれるべきすべての番号を含むリストを作成します
  2. 2番目の空のリストを作成します。
  3. ループに入ります。順序付きリストに番号が含まれている限り、ループは続行されます。

    1. 0とlist.Lengthの間のランダムなインデックスを選択してください
    2. この乱数をランダム化されたリストに入れます
    3. 順序付きリストからインデックス位置のアイテムを削除します。

このように、ランダム化されたリストに入れたい番号のセットを作成し、常に順序付けられたリストからランダムなエントリを選択します。この手法を使用すると、特定の値がリスト内で複数回発生することも実現できます。

現在ここでVisualStudioを実行していないため、コードがc#に対してコンパイルされるかどうかはわかりませんが、コードはほぼ正しいはずです。

于 2012-08-16T12:53:30.703 に答える
2

このようなもの?

const int maxNumbers = 10;
List<int> numbers = new List<int>(maxNumbers);
for (int i = 0; i < maxNumbers; i++)
{
    numbers.Add(i);
}
Random r = new Random();
while (numbers.Count > 0)
{
    int index = r.Next(numbers.Count);
    Console.Write("{0} ", numbers[index]);
    numbers.RemoveAt(index);
}
Console.WriteLine();

編集:任意の乱数の場合:

const int maxNumbers = 10;
const int biggestNumbers = 10000;
List<int> numbers = new List<int>(maxNumbers);
Random r = new Random();
while (numbers.Count < maxNumbers)
{
    int index = r.Next(biggestNumbers);
    if (numbers.IndexOf(index) < 0)
    {
        numbers.Add(index);
        Console.Write("{0} ", index);
    }
}
Console.WriteLine();
于 2012-08-16T12:59:09.763 に答える