如何在不重复数字的情况下使这段代码工作?

我需要以随机顺序打印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(); } 

您需要做的就是检查列表中是否已存在该号码,如果是,请另外获取另一个号码:

 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 numbers = new List(); 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(); } 

你想要的是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; } 

如果您不想重复1到50之间的数字,最好的办法是填充一个数字为1到50的列表,然后随机播放内容。 这里有一个关于改组的好post: 随机化List