3

基本的にタイトルにすべて入っています。単純ですが、Wh​​ile ループが時々失敗する理由がわかりません。ときどき、3 ではなく 2 の長さのリストを取得します。

ここに私のC#コードがあります:

public List<int> generateRequiredSecretCode()
{
    List<int> placeHolder = new List<int>();
    Random random = new Random();
    int randomNo = random.Next(0, 10);
    while (!placeHolder.Contains(randomNo) && placeHolder.Count != 3)
    {
        placeHolder.Add(randomNo);
        randomNo = random.Next(0, 10);
    }
    return placeHolder;
}

私の目的の要約:長さ 3で、リスト内の各数値が 0 から 9 の間であり、一意ある整数のリストが必要です

4

4 に答える 4

7

次を使用して、きちんとした LINQ 2 ライナーを作成できます。

var random = new Random();
return Enumerable.Range(0,10).OrderBy(i => random.NextDouble()).Take(3).ToList();
于 2013-01-18T11:48:35.037 に答える
3

!placeHolder.Contains(randomNo)リストにrandomNoが含まれているとwhileが終了するため、ここで問題になります。!placeHolder.Contains(randomNo)次のような場合は、インナーで確認してください。

while (placeHolder.Count != 3)
{
    if( !placeHolder.Contains(randomNo) )
      placeHolder.Add(randomNo);
    randomNo = random.Next(0, 10);
}
于 2013-01-18T11:44:47.070 に答える
0

パーティーには少し遅れましたが、集合演算は非常に洗練されているようで、我慢できませんでした:

private static Random RNG = new Random();

...

public static List<int> RandomNumbers() {
  var numbers = new HashSet<int> { RNG.Next(0, 9), RNG.Next(0, 9), RNG.Next(0, 9) };
  while (numbers.Count < 3) 
  {
    numbers.Add(RNG.Next(0, 9));
  }

  return numbers.ToList();
}
于 2013-01-18T12:06:56.947 に答える
0

まれに、Rand.Next が既にリストにある thise と同じ番号を!placeHolder.Contains(randomNo)返し、false を返すため、失敗することがあります。false && anything = false なので、ループは終了します。十分に長く実行すると、最終的に長さ1のリストが得られます;)

可能な交換:

List<int> placeHolder = new List<int>();
Random random = new Random();
int randomNo;
do {
    randomNo = random.Next(0, 10);
    if (!placeHolder.Contains(randomNo) && placeHolder.Count != 3)
    {
         placeHolder.Add(randomNo);
         randomNo = random.Next(0, 10);
    }
} while (placeHolder.Count < 3);
return placeHolder;

[編集]: このスレッドは急速に動きました...そしてアニマルの解決策は私のものよりもはるかに優れています:(

于 2013-01-18T11:50:39.050 に答える