2017-12-07 3 views
0
private int pic = 0; 
private List<int> num = null; 
. 
. 
. 

. 
. 
public void ss(){ 
this.imageList = new List<Image>(); 
this.imageList.Add(Properties.Resources.1); 
this.imageList.Add(Properties.Resources.2); 
this.imageList.Add(Properties.Resources.3); 
. 
. 
. 
. 
. 
this.imageList.Add(Properties.Resources.58); 
this.imageList.Add(Properties.Resources.59); 
this.pic = GetMyRandomNumber(0, 60); 

if (this.num == null) 
    this.num= new List<int>(); 

while (this.num.Count < 61) 
{ 
     pic = GetMyRandomNumber(0, 60); 

     if (this.num.Contains(pic) == false) 
     { 
      this.num.Add(pic); 
      break; 
     } 
} 
this.pictureBox1.Image = imageList[pic]; 

}重複する値をどのように比較しますか?

重複のこのコードチェックはNUMの値を格納し、格納された値が重複しているかどうかを確認SS法

を呼び出します。

しかし、同じ値がPIC

重複する値に保存されているが表示されるように続けます。

どうすれば修正できますか?

+0

最初の数字をリストに追加するとすぐにループを解除すると、リストには複数のアイテムがどのように含まれますか?それだけで重複はありますか?より多くのデバッグ情報を提供してください。おそらく、完全な例であっても確認できます。 – David

+0

0から60までの番号をランダムに並べ替える場合は、[Fisher-Yates Shuffle](https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle)を使用することをお勧めします。 – juharr

答えて

0

カップルの事はここで起きている可能性があり、このヘルプ。 "GetMyRandomNumber"メソッドの中では、同じ値を連続して取得するオブジェクトやスレッドの安全性に関する考慮事項を避けるために、特定の方法で使用する必要のある「ランダム」クラスを使用している可能性があります。ここで

は「ランダム」

を使用する代わりに、個々のランダムなオブジェクトをインスタンス化する上でMSDNからの引用である、我々はあなたがあなたのアプリケーションが必要とするすべての乱数を生成するために、単一のランダムなインスタンスを作成することをお勧めします。ただし、ランダムオブジェクトはスレッドセーフではありません。アプリが複数のスレッドからランダムメソッドを呼び出す場合は、同期オブジェクトを使用して、一度に1つのスレッドだけが乱数ジェネレータにアクセスできるようにする必要があります。ランダムオブジェクトがスレッドセーフな方法で確実にアクセスされない場合は、乱数を返すメソッドを呼び出すと0が返されます。

また、選択した乱数を追跡しているようです。

これは、参照速度にも役立つ別の方法です。

static void Main(string[] args) 
    { 
     HashSet<int> picked = new HashSet<int>(Enumerable.Range(0, 60)); 
     int pic = GetMyRandomNumber(picked); 
     //...Other code here 
    } 

    private readonly static object _syncLock = new object(); 
    private readonly static Random _random = new Random(); 

    static int GetMyRandomNumber(HashSet<int> picked) 
    { 
     lock (_syncLock) 
     { 
      int rand = _random.Next(0, picked.Count); 
      picked.Remove(rand); 

      return rand; 
     } 
    } 

これにより、一度0-60の乱数を選択すると、再度選択することができなくなります。

+0

ご返信ありがとうございます。 – ccseh

0

希望

public static void Main(string[] args) 
    { 
     var nums = new List<int>() { 1, 2, 3, 3, 4, 5 }; 
     Print(nums); 
     //REMOVE DUPLIDATED VALUES AT THE LINE BELOW 
     nums = nums.Distinct().ToList(); 
     Print(nums); 
     Console.Read(); 
    } 

    public static void Print(List<int> nums) 
    { 
     foreach (var num in nums) 
     { 
      Console.Write(num.ToString() + ", "); 
     } 
     Console.WriteLine(); 
    } 
+0

ご返信ありがとうございます。 – ccseh

関連する問題