在C#中随机化部分数组

时间:2017-02-09 13:10:12

标签: c# arrays random integer

假设我有一个整数数组。我发现我可以通过以下方式随机化元素的顺序:

Random rnd = new Random();
array = array.OrderBy(x => rnd.Next()).ToArray();

但是我想说我想保留原始位置的第一个和最后一个元素。我可以使用相同的方法(使用OrderBy())或者我需要重新考虑我的情况吗?

5 个答案:

答案 0 :(得分:1)

您不能在单个表达式中执行此操作,但可能List<int>可能有所帮助:

Random rnd = new Random();
var list = new List<int>();
list.Add(array[0]);
var partialArray = array.Skip(1).Take(array.Length - 2);
list.AddRange(partialArray.OrderBy(x => rnd.Next()));
list.Add(array[array.Length -1 ]);

答案 1 :(得分:1)

当然你可以使用相同的方法,但你必须处理第一个和最后一个值。只是输入array的一个示例:

var list = array.Skip(1).Take(array.Length - 2).OrderBy(x => rnd.Next()).ToList();
list.Insert(0, array.First());
list.Add(array.Last());
array = list.ToArray();

Dmitry的例子基本相同,但是你可以选择保留更多元素。

答案 2 :(得分:1)

你可以这样做:

.profile_image{
    min-width: 36px;
    max-width: 150px;
    width: 150px;
    height: auto;
}

答案 3 :(得分:1)

您可以使用经过修改的标准shuffle算法来使用范围,例如(使用the Fisher-Yates algorithm):

public static void Shuffle<T>(IList<T> array, Random rng, int start, int end)
{
    for (int n = end+1; n > start+1;)
    {
        int k = rng.Next(start, n);
        --n;
        T temp = array[n];
        array[n] = array[k];
        array[k] = temp;
    }
}

然后这样称呼:

Random rng = new Random();

for (int i = 0; i < 100; ++i)
{
    var array = Enumerable.Range(1, 12).ToArray();
    Shuffle(array, rng, 3, 9);
    Console.WriteLine(string.Join(", ", array));
}

答案 4 :(得分:0)

稍微不同的方法,不涉及使用List ....

        Random rnd = new Random();
        //array = array.OrderBy(x => rnd.Next()).ToArray();

        int lastIndexToChange = array.Length - 1;

        for (int i = 1; i < lastIndexToChange; i++)
        {
            var tempStore = array[i];
            int newPosition = rnd.Next(1, lastIndexToChange);

            array[i] = array[newPosition];
            array[newPosition] = tempStore;
        }