Я хотел бы создать случайную строку, состоящую из буквенно-цифровых символов. Я хочу, чтобы можно было указать длину строки.
Как мне сделать это в C ++?
Мердад Афшари в ответ будет делать трюк, но я нашел это немного слишком многословен для этой простой задачи. Иногда справочные таблицы могут творить чудеса:
void gen_random(char *s, const int len) {
static const char alphanum[] =
"0123456789"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz";
for (int i = 0; i < len; ++i) {
s[i] = alphanum[rand() % (sizeof(alphanum) - 1)];
}
s[len] = 0;
}
s[len] = 0
неверна. Еслиs
это строка C (завершена NULL), то в сигнатуре метода не должно бытьlen
параметра. Imo, если вы передаете длину в качестве аргумента, вы предполагаете, что массив не является строкой C. Таким образом, если вы не передадите строку C в функцию, строкаs[len] = 0
может разбить вещи, так как массив переместится с 0 на len-1. И даже если вы передаете строку C в функцию, строкаs[len] = 0
будет избыточной.Вот моя адаптация ответа Ates Goral с использованием C ++ 11. Я добавил лямбду здесь, но принцип в том, что вы можете передать ее и тем самым контролировать, какие символы содержит ваша строка:
Вот пример передачи лямбда-функции в случайную строку: http://ideone.com/Ya8EKf
Почему вы используете C ++ 11 ?
Например:
Пример вывода.
источник
rand()
в первом фрагменте кода?rand()
. Это даже не единообразно для громкогоМое 2p решение:
источник
default_random_engine
вместоmt19937
? Код будет выглядеть более общим.std::default_random_engine
это не то, что я рекомендую, так как стандарт не дает никаких гарантий относительно его качества, эффективности или воспроизводимости между реализациями.sizeof
, изменитьauto&
кstd::string
, который дает вамstd::string::length
std::string
вероятно, будет медленнее, потому что он содержит внутренний указатель на свои данные. Это означало бы дополнительное косвенное обращение, которое не требует статический массив. Такжеsizeof
никогда не может быть медленнее, чемstd::string::size
потому, что это постоянная времени компиляции.std::size
он не появлялся до техC++17
пор, пока многие люди только пишут код,C++11/14
поэтому я оставлю все как есть.источник
Я только что проверил это, он работает хорошо и не требует таблицы поиска. rand_alnum () сортирует буквенно-цифровые символы, но поскольку он выбирает 62 из 256 возможных символов, это не имеет большого значения.
источник
Вместо того, чтобы вручную зацикливаться, предпочтительнее использовать соответствующий алгоритм C ++ , в данном случае
std::generate_n
, с подходящим генератором случайных чисел :Это близко к тому, что я бы назвал «каноническим» решением этой проблемы.
К сожалению, правильно заполнить универсальный генератор случайных чисел C ++ (например, MT19937) действительно сложно . Поэтому в приведенном выше коде используется шаблон вспомогательной функции
random_generator
:Это сложно и относительно неэффективно. К счастью, он используется для инициализации
thread_local
переменной и поэтому вызывается только один раз для каждого потока.Наконец, для этого необходимо включить:
Приведенный выше код использует вывод аргументов шаблона класса и, следовательно, требует C ++ 17. Его можно легко адаптировать для более ранних версий, добавив необходимые аргументы шаблона.
источник
std::size_t
дляstd::uniform_int_distribution
? Я не вижу никаких других CTADrng
в качестве параметра по умолчанию, с чем-то вродеtemplate <typename T = std::mt19937> inline thread_local T default_rng = get_random_generator<T>();
std::uniform_int_distribution<>
, что было бы безопасно, но мог бы предупредить о подписанном -> неподписанном преобразовании.Я надеюсь, что это поможет кому-то.
Протестировано на https://www.codechef.com/ide с C ++ 4.9.2
Output: random_str : DNAT1LAmbJYO0GvVo4LGqYpNcyK3eZ6t0IN3dYpHtRfwheSYipoZOf04gK7OwFIwXg2BHsSBMB84rceaTTCtBC0uZ8JWPdVxKXBd
источник
RandomString(100)
:! ;-)std::srand()
должен действительно вызываться только один раз в начале программы (желательно первым деломmain()
). Код, как есть, будет генерировать много одинаковых «случайных» строк, если вызывается в тесном цикле.Вот смешная строчка. Нуждается в ASCII.
источник
источник
std::string
вместоstd::string::value_type[]
Что-то еще более простое и более простое на случай, если вы довольны тем, что ваша строка содержит печатные символы:
источник
Случайная строка, каждый прогон файла = другая строка
источник
std::generate_n
будетcustom_string
иметь длинуLENGTH_NAME
, но это не так.Пример использования Qt :)
источник
Давайте снова сделаем случайным удобным!
Я составил хорошее решение C ++ 11 только для заголовков. Вы можете легко добавить один заголовочный файл в свой проект, а затем добавить свои тесты или использовать случайные строки для других целей.
Это краткое описание, но вы можете перейти по ссылке, чтобы проверить полный код. Основная часть решения находится в классе Randomer:
Randomer
инкапсулирует все случайные вещи, и вы можете легко добавить свои собственные функции к нему. ПослеRandomer
этого очень легко генерировать строки:Напишите ваши предложения по улучшению ниже. https://gist.github.com/VjGusev/e6da2cb4d4b0b531c1d009cd1f8904ad
источник
Еще одна адаптация, потому что ни один из ответов не удовлетворит мои потребности. Прежде всего, если rand () используется для генерации случайных чисел, вы получите один и тот же вывод при каждом запуске. Начальное число для генератора случайных чисел должно быть случайным. В C ++ 11 вы можете включить «случайную» библиотеку и инициализировать начальное число с помощью random_device и mt19937. Это начальное число будет предоставлено операционной системой, и оно будет достаточно случайным для нас (например, часы). Можно указать границы диапазона, включенные [0,25] в моем случае. И последнее, но не менее важное: мне нужна была только случайная строка строчных букв, поэтому я использовал добавление символов. При подходе с пулом персонажей у меня не получилось.
источник
источник
Будьте осторожны при вызове функции
(адаптировано из @Ates Goral ) каждый раз будет приводить к одной и той же последовательности символов. использование
перед вызовом функции, хотя функция rand () всегда заполнена 1 @kjfletch .
Например:
источник
источник
источник