4

ランダムな方法を使用して繰り返しがないように、ランダムに50個の数字を取りたいと思います。

以下はこれまでの私のコードです:

private void settext()
{      
     int i;
     Queue <int> qe= new Queue<int>(50);
     Random rm= new Random();
     for (int g = 0; g < 50; g++)
     {
         i = rm.Next(1, 50);
         if (!qe.Contains(i))
         {
              qe.Enqueue(i);
         }                
     }
 }
4

5 に答える 5

6

まだ使用していない数字が見つかるまでループするのではなく、50 個の可能な数字を含むリスト (または配列) を作成し、シャッフルすることをお勧めします。その後、好きなだけそれらを取得できます。

スタック オーバーフローには、このようなシャッフルに関する質問がたくさんあります。

これの利点は、パフォーマンスが完全に予測可能で直線的であることです。一方、50 個の数字から 50 個すべてを取得すると、最後に最後の数字を取得するまで乱数を生成し続ける必要があります。50 の場合はそれほど悪くありませんが、数十万の数がある場合を想像してみてください...

(また、既存のコードでは 20 という数字がどこにも使用されていないことに注意してください。これは、20 個の数字だけを生成しようとしている場合に警鐘を鳴らすはずです...)

于 2012-12-25T09:18:10.140 に答える
1

コードの唯一の問題は、重複が見つかった場合でもループをインクリメントしていて、キュー内のすべての値 (50) を取得していないことです。while ループを使用して、重複しない値が見つかった場合にのみインデックスをインクリメントすることができます。

int index=0;
int i;
Queue<int> qe = new Queue<int>(50);
Random rm = new Random();
while(index< 50)
{
    i = rm.Next(1, 51); //to get from 1 to 50
    if (!qe.Contains(i)) //to check for duplicate
    {
        qe.Enqueue(i);
        ++index;
    }

}

上記は、50 個の一意の乱数を生成します。それらから 20 個の数字を取得する場合は、次のようにします。

var numbers = qe.Take(20);
于 2012-12-25T09:13:38.693 に答える
1

50個の異なる数字を見つけるように強制している一方で、49個の可能な数字の範囲からのみ生成できるようにしていると思います。rm.Next(50) + 1代わりに試してください。

于 2012-12-25T09:15:55.663 に答える
1

Linq を使用してみませんか?

private static Random rand = new Random();

var twentyUniqueNumbers = RandomNumberStream().Distinct().Take(20);

IEnumerable<int> RandomNumberStream()
{
  yield return rand.Next(1,50);
}

またはさらに良いのは、50 個の数字のリストを作成し、シャッフルしてから 20 個を取得することです...

var twentyUniqueNumbers = Enumerable.Range(0,50)
                                    .OrderBy(s => rand.Next());
                                    .Take(20);

これにより、より予測可能なパフォーマンスが得られます。

于 2012-12-25T09:17:39.833 に答える
0

あなたの論理に従って、これを書く方が簡単かもしれません:

var results = new HashSet<int>();
var random = new Random();
while (results.Count < 20)
{
    results.Add(random.Next(1, 50));
};

すべての番号は一度だけ追加されるため、番号がすでにハッシュセットに追加されているかどうかを確認する必要はありません...

ただし...これは、解決しようとしている問題を理解するのに役立つ簡単な修正にすぎませんが (基本的には教室の例です)、Jon Skeet から提供されたアドバイスを実際に受ける必要があります。上記のコードを実際に実行するには時間がかかります。

注意すべきもう1つのことは、FIFOバッファのように使用することを目的としたQueueクラスを使用していることです...これは実際には問題には当てはまりません。

于 2012-12-25T15:51:19.027 に答える