2012-11-02 117 views
3
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個隨機數,但複製了設備。我需要一種方法來防止出現重複的號碼。避免隨機重複

+0

@PLB:或簡單地將它洗。 – Wug

回答

11

最簡單辦法國際海事組織將產生的所有可能的數字(即1-37)的序列,洗牌的集合,然後取前七個結果。

搜索堆棧溢出的「費雪耶茨洗牌C#」就會發現很多例子。

事實上,你可以修改費雪耶茨洗牌,你帶他們到產生結果,所以你可以寫一個方法,如:

var numbers = Enumerable.Range(1, 37).Shuffle().Take(7).ToList(); 
0

你可以他們折騰成HashSet<int>。如果你Add並且返回false,則生成一個新號碼。

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]; 
} 
+0

謝謝,這就像一個魅力!我還沒有了解你寫的代碼的第一句話。 「Enumerable.Range(1,37).ToArray();」部分,所以我想必須有另一種方法來實現相同。 – Leth

+0

你可以做'int [] allPossibleNumbers = new int [] {1,2,3,4,5,/ * yawn * /,36,37};' - 我的只是懶惰的版本。 – Rawling

0

可爲您的37項的列表。 然後在你的選擇之一,並刪除所選

1

你可以採取一本字典,但請務必防止重複鍵插入。詞典的按鍵將作爲您需要

+0

這種方法會有明顯的開銷,但是在廢除重複時會是一種愚蠢的證明。 – Amber

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(); 
     } 
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會自動忽略重複。只需循環,直到達到您需要的單位數量。只有潛在的問題是潛在的問題(不太可能)長時間循環,但最終應該回應。

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(); 
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)); 

的表現將優於隨機播放和HashSet的方法爲nPicks/nBalls變大。