假设我有一个整数数组。我发现我可以通过以下方式随机化元素的顺序:
Random rnd = new Random();
array = array.OrderBy(x => rnd.Next()).ToArray();
但是我想说我想保留原始位置的第一个和最后一个元素。我可以使用相同的方法(使用OrderBy())或者我需要重新考虑我的情况吗?
答案 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;
}