从整数列表中获取随机数
如果我有一个整数列表:
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)]);