толковый словарьсоставить карту алфавита - с уникальными ключами и значениями - PullRequest
1 голос
/ 14 сентября 2011

Мне нужно создать словарь, который выражает отображение между каждым символом в алфавите и другим символом в этом алфавите, где ключ и значение являются уникальными - как очень простой шифр, который выражает, как кодировать / декодировать сообщение , Не может быть повторяющихся ключей или значений.

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

        string source_alphabet = _alphabet; //ie "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
        string target_alphabet = _alphabet;

        Dictionary<char, char> _map = new Dictionary<char, char>();

        for (int i = 0; i < source_alphabet.Length; i++)
        {
            int random = _random.Next(target_alphabet.Length - 1); //select a random index

            char _output = target_alphabet[random]  //get the char at the random index

            _map.Add(source_alphabet[i], _output); //add to the dictionary

            target_alphabet = target_alphabet.Replace(_output.ToString(), string.Empty); 
            // remove the char we just added from the remaining alphabet
        } 

Спасибо.

Ответы [ 4 ]

1 голос
/ 14 сентября 2011

«быстрое исправление», хотя и не оптимальное, будет (если отображение А на А НЕ разрешено)

 int random = _random.Next(target_alphabet.Length - 1);
 while ( source_alphabet[i] == target_alphabet[random] ) {random = _random.Next(target_alphabet.Length - 1);};

, если разрешено отображение A на A, тогда игнорируйте указанное выше изменение ... НО хотя бы измените последнюю строку на

target_alphabet = target_alphabet.Remove ( random, 1 );
1 голос
/ 14 сентября 2011

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

Псевдокод

Shuffle(sequence1)
Shuffle(sequence2)

for index 0 to 25
    dictionary add sequence1[index], sequence2[index]

Когда вы пытаетесь выбрать случайное значение каждый раз , существует высокая вероятность того, что вы получите столкновение и, следовательно, выберете неуникальное значение. Ответ обычно перемешать, затем выбрать по порядку.

0 голосов
/ 14 сентября 2011

Это работает.

 for (int i = 0; i < source_alphabet.Length; i++)
    {
        int random = _random.Next(target_alphabet.Length - 1); //select a random index

        char _output = target_alphabet[random];  //get the char at the random index


        _map.Add(source_alphabet[i], _output); //add to the dictionary

        // remove the char we just added from the remaining alphabet
        target_alphabet = target_alphabet.Remove(random, 1);


    }
0 голосов
/ 14 сентября 2011

Полагаю, вы могли бы добавить еще один цикл «for» в target_alphabet внутри существующего цикла «for» и проверить, не совпадают ли символы с небольшим условием «если», и продолжить внутренний цикл, если он такой же, или прервать, если нет.

...