您不会找到比 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
请注意,您可能会对它的运行速度感到惊讶。引擎盖下发生了很多事情。rand() % n
最后,这使用了 C++11 随机库,特别是均匀分布,它消除了传统解决方案中通常遇到的模数偏差n
。