-1

これが私の問題を示すためのいくつかの簡単なコードです:

 void method()
 {
   for(int i = 0;i<=99)
   {
     method1();
     method2();
   }
  }

void method1()
{
    if(Randombool())
    {
        bool exists = true;
        int n;
        while(exists)
        {
            n=RandNum(100);
            exists = list1.Exists(num => num == n);
        }
        list1.add(n);
    }
}

void method2()
{
    int n;
    bool exists = true;
    bool exists2 = true;
    while(!(exists && !exists2))
    {
        n = RandNum(100);
        exists = list1.Exists(elem => elem == n);
        exists2 = list2.Exists(elem => elem == n);
    }
    list2.add(n)
}

それがwhilemethod2からのループで長い間スタックすることは明らかです。

待つのを避けるために、もっと穏やかな方法で数字を生成する方法はありますか?

4

1 に答える 1

5

N個の数字のランダムなシーケンスを生成しようとしているようです。ここで使用しているアプローチは、乱数を取得し、それが既に持っている場合はそれを破棄することです。

あなたがしたいのは、適度に効率的に実行できる配列をシャッフルすることです。リストに0、1、2、...を順番に入力してから、シャッフルします。

上記のリンクからコピーされた擬似コード:

To shuffle an array a of n elements (indices 0..n-1):
  for i from n − 1 downto 1 do
       j ← random integer with 0 ≤ j ≤ i
       exchange a[j] and a[i]
于 2012-05-25T21:00:22.530 に答える