在保留特定元素的同时随机化数组?
Randomize an array while leaving specific elements in place?
快速提问,我的逻辑有些不对。基本上我想洗牌或随机化一个数组,但保留特定元素。任何超过 900 的东西都应该保持在相同的位置。这看起来应该可行,但显然我遗漏了一些东西。
public static int[] ShuffleArray(int[] data)
{
for (int t = 0; t < data.Length; t++)
{
int tmp = data[t];
if (tmp < 900)
{
int r;
do
{
r = (int)RandomBetween(t, data.Length);
} while (r > 900);
data[t] = data[r];
data[r] = tmp;
}
}
return data;
}
正在输入:
0,0,1,1,2,2,3,
3,999,4,5,1,999,6,
0,0,1,999,2,2,3,
3,4,4,5,5,6,6,
0,999,1,1,999,999,3,
3,4,4,5,5,6,6,
0,0,1,1,2,2,3,
得到这个:
3,5,6,2,6,1,0,
999,999,3,3,5,999,6,
2,4,999,1,999,2,4,
5,2,0,999,2,1,3,
0,1,5,6,2,0,4,
0,0,4,3,6,0,3,
1,1,5,4,3,1,1,
我以为我是用 <900 捕捉到它的,然后做……我在这里错过了什么? 999 需要留在原地。
您的逻辑不正确,因为您使用 r
作为索引。
改变这个:
while (r > 900)
为此:
while (data[r] > 900)
请注意,您的算法本身效率极低。
快速提问,我的逻辑有些不对。基本上我想洗牌或随机化一个数组,但保留特定元素。任何超过 900 的东西都应该保持在相同的位置。这看起来应该可行,但显然我遗漏了一些东西。
public static int[] ShuffleArray(int[] data)
{
for (int t = 0; t < data.Length; t++)
{
int tmp = data[t];
if (tmp < 900)
{
int r;
do
{
r = (int)RandomBetween(t, data.Length);
} while (r > 900);
data[t] = data[r];
data[r] = tmp;
}
}
return data;
}
正在输入:
0,0,1,1,2,2,3,
3,999,4,5,1,999,6,
0,0,1,999,2,2,3,
3,4,4,5,5,6,6,
0,999,1,1,999,999,3,
3,4,4,5,5,6,6,
0,0,1,1,2,2,3,
得到这个:
3,5,6,2,6,1,0,
999,999,3,3,5,999,6,
2,4,999,1,999,2,4,
5,2,0,999,2,1,3,
0,1,5,6,2,0,4,
0,0,4,3,6,0,3,
1,1,5,4,3,1,1,
我以为我是用 <900 捕捉到它的,然后做……我在这里错过了什么? 999 需要留在原地。
您的逻辑不正确,因为您使用 r
作为索引。
改变这个:
while (r > 900)
为此:
while (data[r] > 900)
请注意,您的算法本身效率极低。