gpt4 book ai didi

c# - 混合起来,然后再次重新排序 .Net 2.0 中的数组

转载 作者:行者123 更新时间:2023-11-30 14:01:04 24 4
gpt4 key购买 nike

我想我遇到了一个有趣的问题 - 如何对数组进行打乱,然后撤消打乱。请记住,这需要使用 .Net 2.0 来完成。

我的思路如下图所示:

  1. 以某种方式为数组中的每一项标记某种索引
  2. 随机排列数组
  3. 使用索引重新排序数组

byte[] b = new byte[] {1=>33,2=>19,3=>41,n=>N}
b.Sort();

数组现在可能如下所示:

byte[] b = new byte[] {3=>41,2=>19,1=>33,n=>NN ... etc.};

拜托,有人告诉我我想在这里做什么是可能的,如果确实可行,请指出正确的方向。

谢谢,

埃文

最佳答案

我建议使用 Fisher-Yates 算法和给定的整数键对数组进行洗牌,然后取消洗牌。 key 可以是固定的或随机的,但为了检索原始数组,两个操作的 key 必须是相同的数字。

Unscramble 比 Scramble 稍微复杂一点,因为交换序列必须使用用相同种子初始化的 Random 生成,然后以相反的顺序应用。

void Scramble<T>(T[] array, int key)
{
var random = new Random(key);
for (int i = array.Length; i > 1; i--)
{
Swap(array, random.Next(i), i - 1);
}
}

void Unscramble<T>(T[] array, int key)
{
var random = new Random(key);
var swaps = new List<int>(array.Length);
for (int i = array.Length; i > 1; i--)
{
swaps.Add(random.Next(i));
}
swaps.Reverse();
for (int i = 0 ; i < swaps.Count; ++i)
{
Swap(array, swaps[i], i + 1);
}
}

void Swap<T>(T[] array, int i1, int i2)
{
T tmp = array[i2];
array[i2] = array[i1];
array[i1] = tmp;
}

关于c# - 混合起来,然后再次重新排序 .Net 2.0 中的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9163703/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com