我正在使用一个函数来混洗并返回传递列表:
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%的列表元素来交换位置。
欢迎任何帮助。
发布于 2019-02-12 20:23:16
首先,我对你的代码做了一个小的修复:
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();https://stackoverflow.com/questions/54649366
复制相似问题