4
System.Random generator = new Random(DateTime.Now.Millisecond);
int[] lotteryNumber = new int[7];

Console.WriteLine("Your lottery numbers: ");
for (int i = 0; i<7; i++)
{
    lotteryNumber[i] = generator.Next(1, 37);
    Console.Write("{0} ",lotteryNumber[i]);
}
Console.ReadLine();

7 つの宝くじ番号を印刷するプログラムを作成する必要がありますが、重複はありません。上記のコードは、(1-37) の範囲の 7 つの乱数を出力しますが、重複が表示されます。重複した番号が表示されないようにする方法が必要です。

4

9 に答える 9

12

IMO の最も単純なアプローチは、可能なすべての数字 (つまり 1 ~ 37) のシーケンスを生成し、コレクションをシャッフルしてから、最初の 7 つの結果を取得することです。

Stack Overflow で「Fisher-Yates shuffle C#」を検索すると、多くの例が見つかります。

実際、Fisher-Yates shuffle を変更して、取得した結果を得ることができるため、次のようなメソッドを記述できます。

var numbers = Enumerable.Range(1, 37).Shuffle().Take(7).ToList();
于 2012-11-02T13:03:22.530 に答える
1

辞書を使用することもできますが、キーの重複挿入を防ぐようにしてください。辞書のキーは、必要な一意の番号として機能します

于 2012-11-02T13:06:36.923 に答える
0

だから私はあなたの元のコードを取りました...いくつかの論理エラーを見つけ、乱数の重複を防ぐためにあなたが探していた修正を追加しました.

楽しみ!

 System.Random generator = new Random(DateTime.Now.Millisecond);
            int[] lotteryNumber = new int[7];
            int lowerBounds = 1;
            int upperBounds = 8;
            int maxNumberLotteryValues = 7;

            if ( ( upperBounds - lowerBounds ) < (maxNumberLotteryValues))
            {
                Console.Write("Warning: Adjust your upper and lower bounds...there are not enough values to create a unique set of Lottery numbers! ");

            }
            else
            {
                Console.WriteLine("Your lottery numbers: ");
                for (int i = 0; i < maxNumberLotteryValues; i++)
                {
                    int nextNumber = generator.Next(lowerBounds, upperBounds);
                    int count = lowerBounds;  //Prevent infinite loop

                    while ((lotteryNumber.Contains(nextNumber))
                        && (count <= upperBounds))
                    {
                        nextNumber = generator.Next(lowerBounds, upperBounds);
                        count++;  //Prevent infinite loop
                    }

                    lotteryNumber[i] = nextNumber;
                    Console.Write("{0} ", lotteryNumber[i]);
                }
            }

            Console.ReadLine();
于 2012-11-02T13:54:15.143 に答える
0

既存の番号を取得した場合は、配列にない新しい番号を見つけてみてください。

static void Main(string[] args)
        {
            System.Random generator = new Random(DateTime.Now.Millisecond); int[] lotteryNumber = new int[7];

            Console.WriteLine("Your lottery numbers: ");
            for (int i = 0; i < 7; i++)
            {
                int lNumber = 0;
                do
                {
                    lNumber = generator.Next(1, 37);
                }
                while (lotteryNumber.Contains(lNumber));
                lotteryNumber[i] = lNumber;

                Console.Write("{0} ", lotteryNumber[i]);
            }
            Console.ReadLine();
        }
于 2012-11-02T13:09:49.333 に答える
0
HashSet<int> set = new HashSet<int>();
System.Random generator = new Random(DateTime.Now.Millisecond);

while(set.Count < 7){
    set.Add(generator.Next(1,37);
}

HashSet は重複を自動的に無視するため、これでうまくいくはずです。セットが必要なユニット数に達するまでループするだけです。唯一の潜在的な問題は、長時間ループする可能性がある (可能性は低い) ことですが、最終的には応答するはずです。

于 2012-11-02T13:10:14.803 に答える
0

それらを に投げることができますHashSet<int>。あなたAddとそれがfalseを返す場合は、新しい番号を生成してください。

于 2012-11-02T13:03:02.333 に答える
0

繰り返しなしで範囲から数字を選択しようとしている場合は、可能なすべての数字の配列を作成してから、ランダムな選択を「シャッフル」する必要があります。

int[] allPossibleNumbers = Enumerable.Range(1, 37).ToArray();
int[] lotteryNumber = new int[7];
for (int i = 0; i < 7; i++)
{
    int index = r.Next(i, 37);
    lotteryNumber[i] = allPossibleNumbers[index];
    allPossibleNumbers[index] = allPossibleNumbers[i];
    // This step not necessary, but allows you to reuse allPossibleNumbers
    // rather than generating a fresh one every time.
    // allPossibleNumbers[i] = lotteryNumber[i];
}
于 2012-11-02T13:03:21.313 に答える
0

37 項目のリストを作成します。次に、forで1つを選択し、選択したものを削除します

于 2012-11-02T13:04:16.293 に答える
0
const int nBalls = 37;
const int nPicks = 6;
int[] balls = new int[nPicks];
Random rnd = new Random(DateTime.Now.Millisecond);

int remainingBalls=nBalls;
int remainingPicks=nPicks;
for (int i = 1; i <= nBalls; i++)
{
    if (rnd.Next(1, remainingBalls+1) <= remainingPicks)
        balls[--remainingPicks]=i;
    remainingBalls--;
}

Console.WriteLine(string.Join(",",balls));

nPicks/nBalls が大きくなると、Shuffle および HashSet メソッドよりも優れたパフォーマンスを発揮します。

于 2017-11-05T13:18:34.390 に答える