我怎么能改善这个C#的方法随机化? [英] How could I improve this C# randomising method?
本文介绍了我怎么能改善这个C#的方法随机化?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想我已经在此落户,作为一个随机化列表中最简单的单元测试的方法,但有兴趣听到任何改进。
公共静态的IList< T> RandomiseList< T>(IList的< T>列表,INT种子)
{
随机随机=新的随机(种子);
名单< T> takeFrom =新的List< T>(名单);
名单< T> RET =新的List< T>(takeFrom.Count);
而(takeFrom.Count大于0)
{
INT POS = random.Next(0,takeFrom.Count - 1); $ B $(B T)项目= takeFrom [POS]
takeFrom.RemoveAt(POS)
ret.Add(项目);
}
返回RET;
}
解决方案
您想要一个洗牌,并做到这一点的最好办法是费雪耶茨洗牌:
公共静态的IList< T>随机化< T>(IList的< T>列表,INT种子)
{
随机RNG =新的随机(种子);
名单< T> RET =新的List< T>(名单);
INT N = ret.Length;
,而(N大于1)
{
N--;
INT K = rng.Next第(n + 1);
//变量$ B $(B T)TMP =列表[K]简单交换;
保留[K] =保留[n]的;
RET [N] = tmp目录;
}
返回RET;
}
I think I've settled on this as the most simple and unit-testable method for randomising a list, but would be interested to hear of any improvements.
public static IList<T> RandomiseList<T>(IList<T> list, int seed)
{
Random random = new Random(seed);
List<T> takeFrom = new List<T>(list);
List<T> ret = new List<T>(takeFrom.Count);
while (takeFrom.Count > 0)
{
int pos = random.Next(0, takeFrom.Count - 1);
T item = takeFrom[pos];
takeFrom.RemoveAt(pos);
ret.Add(item);
}
return ret;
}
解决方案
You want a shuffle, and the best way to do that is the Fisher-Yates shuffle:
public static IList<T> Randomise<T>(IList<T> list, int seed)
{
Random rng = new Random(seed);
List<T> ret = new List<T>(list);
int n = ret.Length;
while (n > 1)
{
n--;
int k = rng.Next(n + 1);
// Simple swap of variables
T tmp = list[k];
ret[k] = ret[n];
ret[n] = tmp;
}
return ret;
}
这篇关于我怎么能改善这个C#的方法随机化?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文