我正在使用一个函数来随机播放并返回传递的列表:
public static List<E> ShuffleList<E>(List<E> inputList)
{
var randomList = new List<E>();
var r = new Random();
var randomIndex = 0;
while (inputList.Count > 0)
{
randomIndex = r.Next(0, inputList.Count);
randomList.Add(inputList[randomIndex]);
inputList.RemoveAt(randomIndex);
}
return randomList;
}
我面临的挑战是确定“随机化程度”是此后的改组清单。我如何确保至少50%的元素不在其初始位置?
同样,我们的目标是重新整理列表以及至少50%的列表元素以交换位置。
欢迎任何帮助。
答案 0 :(得分:2)
我已经对您的代码进行了一些小修正,开始于:
private static Random r = new Random();
public static List<E> ShuffleList<E>(List<E> inputList)
{
var working = new List<E>(inputList);
var randomList = new List<E>();
var randomIndex = 0;
while (working.Count > 0)
{
randomIndex = r.Next(0, working.Count);
randomList.Add(working[randomIndex]);
working.RemoveAt(randomIndex);
}
return randomList;
}
现在我可以测试它了。
void Main()
{
var size = 100;
var loops = 1000000;
var original = Enumerable.Range(0, size).ToList();
var counter = 0;
var collisions = 0;
while (counter++ < loops)
{
var shuffled = ShuffleList(original);
collisions += shuffled.Select((x, n) => x == n).Where(x => x).Count();
}
Console.WriteLine((double)collisions / counter / size);
}
这显示的是排序后处于相同位置的元素的平均数量。我得到像0.00998599001400999
或0.01000271999728
这样的结果来运行此代码。
您的代码成功将100个列表中的99%的数字移到了新位置。
为了简化生活,您还可以将代码重写为:
private static Random r = new Random();
public static List<E> ShuffleList<E>(List<E> inputList)
=> inputList.OrderBy(x => r.Next()).ToList();