从整数列表中获取随机数

如果我有一个整数列表:

List myValues = new List(new int[] { 1, 2, 3, 4, 5, 6 } ); 

如何从该列表中获得3个随机整数?

一个简单的方法:

 Random r = new Random(); IEnumerable threeRandom = myValues.OrderBy(x => r.Next()).Take(3); 

更好的方式: 费舍尔 – 耶茨洗牌 :

 public static class EnumerableExtensions { public static IEnumerable Shuffle(this IEnumerable source) { return source.Shuffle(new Random()); } public static IEnumerable Shuffle(this IEnumerable source, Random rng) { if (source == null) throw new ArgumentNullException("source"); if (rng == null) throw new ArgumentNullException("rng"); return source.ShuffleIterator(rng); } private static IEnumerable ShuffleIterator( this IEnumerable source, Random rng) { List buffer = source.ToList(); for (int i = 0; i < buffer.Count; i++) { int j = rng.Next(i, buffer.Count); yield return buffer[j]; buffer[j] = buffer[i]; } } } 

你如何使用它:

 IEnumerable threeRandom = myValues.Shuffle().Take(3); 

最简单的方法是这样的:

 var r = new Random(); var myValues = new int[] { 1, 2, 3, 4, 5, 6 }; // Will work with array or list var randomValues = Enumerable.Range(0, 3) .Select(e => myValues[r.Next(myValues.Length)]); 

但是一个更好的方法,如果你想确保没有重复是使用一个改组算法,如Fisher-Yates算法 ,那么采取前3项:

 public static T[] Shuffle(IEnumerable items) { var result = items.ToArray(); var r = new Random(); for (int i = items.Length; i > 1; i--) { int j = r.Next(i); var t = result[j]; result[j] = result[i - 1]; result[i - 1] = t; } return result; } var myValues = new int[] { 1, 2, 3, 4, 5, 6 }; // Will work with any enumerable var randomValues = myValues.Shuffle().Take(3); 

将其他答案与此答案相结合可以引导您进行以下操作:

 var rand = new Random(); var numbers = Enumerable.Range(1, 6).OrderBy(i => rand.Next()).ToList(); 

在这种情况下, 1是起始值(包括), 6是要生成的整数。

有办法做到这一点! 一个简单的谷歌可以获取数百个答案。 但是,你可以这样做!

 myList.OrderBy(x => rnd.Next()).Take(3) 

使用以下代码获取数字:

 int k = 3; // items to select var items = new List(new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }); var selected = new List(); var neededItem = k; var availableItem = items.Count; var rand = new Random(); while (selected.Count < k) { if( rand.NextDouble() < neededItem / availableItem ) { selected.Add(items[availableItem-1]) neededItem--; } availableItem--; } 

或这个:

 myList.OrderBy(x => Guid.newGuid()).Take(3) 
 int[] x = {1,2,3,4}; string result = Convert.ToString(x[(new Random()).Next(4)]);