2013-10-04 17 views
0

我需要以隨機順序從1到50打印數字,而不重複 它。如何讓這段代碼無需重複數字就可以工作?

static void Main(string[] args) 
{ 
    ArrayList r = new ArrayList(); 

    Random ran = new Random();  
    for (int i = 0; i < 50; i++) 
    { 
     r.Add(ran.Next(1,51)); 

    } 

    for (int i = 0; i < 50; i++) 
     Console.WriteLine(r[i]); 
    Console.ReadKey(); 
} 
+0

實現看看這個算法:http://stackoverflow.com/questions/12294128/generating-random-numbers-and-inserting-into-array-without-重複 – Matheno

+0

不要再使用'ArrayList'。當C#沒有_generics_時,它屬於過去的日子。改爲使用'List '。 –

回答

0

所有你需要做的是檢查,如果該號碼在列表中已經存在,如果是這樣得到另一個:

static void Main(string[] args) 
{ 
    ArrayList r = new ArrayList(); 

    Random ran = new Random();  
    int num = 0; 

    for (int i = 0; i < 50; i++) 
    { 
     do { num = ran.Next(1, 51); } while (r.Contains(num)); 
     r.Add(num); 
    } 

    for (int i = 0; i < 50; i++) 
     Console.WriteLine(r[i]); 

    Console.ReadKey(); 
} 

編輯:這將大大增加在效益分析,防止長時間的暫停等待一個非碰撞號碼:

static void Main(string[] args) 
    { 
     List<int> numbers = new List<int>(); 

     Random ran = new Random(); 
     int number = 0; 
     int min = 1; 
     int max = 51; 

     for (int i = 0; i < 50; i++) 
     { 
      do 
      { 
       number = ran.Next(min, max); 
      } 
      while (numbers.Contains(number)); 

      numbers.Add(number); 

      if (number == min) min++; 
      if (number == max - 1) max--; 
     } 

     for (int i = 0; i < 50; i++) 
      Console.WriteLine(numbers[i]); 

     Console.ReadKey(); 
    } 
1

如果您不想重複1到50之間的數字,您最好的辦法是用數字1到50填充一個列表,然後洗刷內容。有一個關於洗牌這裏好的帖子: Randomize a List<T>

2

你想在這裏什麼是Fisher Yates Shuffle

這裏是由Jeff Atwood

cards = Enumerable.Range(1, 50).ToList(); 
for (int i = cards.Count - 1; i > 0; i--) 
{ 
    int n = ran.Next(i + 1); 
    int temp = cards[i]; 
    cards[i] = cards[n]; 
    cards[n] = temp; 
}