Я пытаюсь сгенерировать случайный идентификатор строки для программы (идентификатор должен быть уникальным только во время выполнения программы). Сначала я сделал это на Python без каких-либо проблем:
class RandomIdGenerator:
_base_62_chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
@classmethod
def get_base_62(cls, length):
return "".join([random.choice(RandomIdGenerator._base_62_chars) for _ in range(length)])
Но так как мне нужно, чтобы моя программа была на C ++, я пытаюсь сгенерировать с ней ту же строку. Вот что я делаю сейчас:
void Node::setId()
{
QString allow_symbols("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
qsrand(QTime::currentTime().msec());
for (int i = 0; i < ID_LENGTH; ++i) {
id_.append(allow_symbols.at(qrand() % (allow_symbols.length())));
}
}
У меня есть две основные проблемы. Во-первых, он не использует C ++ 11 (я не знаю, как работает Qt, но я не думаю, что это C ++ 11), и сгенерированные идентификаторы одинаковы. Если я сгенерирую четыре из них, я получу:
"R4NDM1xM"
"R4NDM1xM"
"R4NDM1xM"
"R4NDM1xM"
Я пытался использовать метод C ++ 11, но получал один и тот же результат, даже хуже, при каждом выполнении я получал точно такой же результат:
void Node::setId()
{
id_ = "";
const std::string str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
std::random_device rd;
std::mt19937 generator(rd());
std::uniform_int_distribution<int> dist(0, str.size() - 1);
for (int i = 0; i < Node::ID_LENGTH; ++i)
id_ += str[dist(generator)];
}
Как генерировать случайный идентификатор строки при каждом вызове метода?