c#随机列表确定百分比

时间:2019-02-12 11:41:33

标签: c# list

我正在使用一个函数来随机播放并返回传递的列表:

    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%的列表元素以交换位置。

欢迎任何帮助。

1 个答案:

答案 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.009985990014009990.01000271999728这样的结果来运行此代码。

您的代码成功将100个列表中的99%的数字移到了新位置。

为了简化生活,您还可以将代码重写为:

private static Random r = new Random();

public static List<E> ShuffleList<E>(List<E> inputList)
    => inputList.OrderBy(x => r.Next()).ToList();