O(N*len) よりも優れたソリューションを見つけることはできません。ここで、N は文字列の数であり、len はその中のそれぞれの長さです。そうは言っても、これを行うための最も高密度のコードを書くことで獲得できる変色したステッカーがどこかにあると確信しています。
#include <iostream>
#include <iterator>
#include <vector>
#include <random>
#include <algorithm>
int main()
{
static const char alphabet[] =
"abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"0123456789";
static const size_t N_STRS = 10000;
static const size_t S_LEN = 32;
std::random_device rd;
std::default_random_engine rng(rd());
std::uniform_int_distribution<> dist(0,sizeof(alphabet)/sizeof(*alphabet)-2);
std::vector<std::string> strs;
strs.reserve(N_STRS);
std::generate_n(std::back_inserter(strs), strs.capacity(),
[&] { std::string str;
str.reserve(S_LEN);
std::generate_n(std::back_inserter(str), S_LEN,
[&]() { return alphabet[dist(rng)];});
return str; });
std::copy(strs.begin(), strs.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
return 0;
}
出力(簡潔にするために 9990 行を省略 =P)
MRdeOWckfKy8GTFt0YmQMcM6SABJc934
XvdcatVsv6N9c1PzQGFFY6ZP943yIrUY
xpHzxUUyAizB6BfKldQzoePrm82PF1bn
kMUyPbflxk3yj3IToTFqYWnDq6aznKas
Ey0W5SF37VaeEY6PxWsBoxlNZTv9lOUn
iTx7jFRTHHW6TfYl7N3Hne4yu7kgAzp5
0ZamlaopjLyEvJbr6fzJPdXmjLOohtKh
6ZYeqj47nCMYKj0sCGl2IHm28FmvuH8h
oTDYRIA1trN1A2pQjsBwG3j9llzKIMhw
5zlpvSgTeLQ38eFWeSDoSY9IHEMHyzix
そして、これがどれほど速く実行されるかに驚くかもしれません。ボンネットの下でかなり多くのことが起こっています。最後に、これは C++11 ランダム ライブラリ、特に一様分布を使用します。これによりrand() % n
、特定のn
.