Перепутайте, затем еще раз пересортируйте массив в .Net 2.0 - PullRequest
3 голосов
/ 06 февраля 2012

Мне кажется, я столкнулся с интересным вопросом - как скремблировать, а затем отменить скремблирование в массиве. Пожалуйста, имейте в виду, что это необходимо сделать с помощью .Net 2.0.

Мой мыслительный процесс показан ниже:

  1. Каким-то образом, подписать некоторый индекс для каждого элемента в массиве
  2. Рандомизировать массив
  3. Использование индексов для повторной сортировки массива

байт [] b = новый байт [] {1 => 33,2 => 19,3 => 41, n => N}
b.Sort ();

Теперь массив может выглядеть так:

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

Пожалуйста, кто-нибудь, скажите мне, что я хотел бы сделать здесь, и если это действительно возможно, пожалуйста, укажите мне правильное направление.

Спасибо

Evan

Ответы [ 2 ]

7 голосов
/ 06 февраля 2012

Я бы предложил перестановку и затем перестановку массива с использованием алгоритма Фишера-Йейтса и заданного целочисленного ключа. Ключ может быть фиксированным или случайным, но для получения исходного массива он должен быть одинаковым для обеих операций.

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;
}
1 голос
/ 06 февраля 2012

Почему бы просто не скопировать исходный массив перед рандомизацией?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...