Как выбрать рандомные буквы из строки без повтора?

112
25 декабря 2020, 22:50

Я сделал это:

    static Random rnd = new Random();
    static string alphabet = "abcdefghijklmnpqrstuvxwyz";
    string GenerateRandomKey(int length)
    {
        StringBuilder key = new StringBuilder();
        for (int i = 0; i < length; i++)
        {
            key.Append(alphabet[rnd.Next(0, alphabet.Length - 1)]);
        }
        return key.ToString();
    }

Проблема в том, что рандом иногда выводит одинаковые буквы, например abdbdbZZysdhAA(большие буквы - повторы). Из-за этого у меня программа не работает, как я понял.

На одной строчке должны быть разные буквы.

Answer 1

Судя по примеру, вам требуется, чтобы последовательные символы не совпадали. Для этого достаточно исключить прошлое значение индекса из диапазона генерации

int rn = -1;      
for (int i = 0; i < length; i++)
{
    if (rn < 0)  
         rn = rnd.Next(0, alphabet.Length - 1);
    else
         rn = (rnd.Next(rn + 1,  rn + alphabet.Length - 1)) % alphabet.Length;
    key.Append(alphabet[rn]);
}    
READ ALSO
SQL. Не работает запрос EXISTS

SQL. Не работает запрос EXISTS

Пытаюсь вставить в свою таблицу данные с использованием EXISTS, однако сервер это условие игнорирует и просто вставляет всем студентам оценки

160
Laravel импорт данных из Excel

Laravel импорт данных из Excel

Вопрос уже не раз задавался в сообществе, но меня интересует детали скорее, чем само решениеИтак, ситуация рядовая: есть таблицы

111
Doctrine наследование Single Table

Doctrine наследование Single Table

Если использовать Single Table наследование в doctrineИ у 2 разных дочерних классов будут свойства с одинаковым именем к примеру (price), возникнут какие...

118
Autoload psr-4 with composer

Autoload psr-4 with composer

Прошу помощи, тк

100