我正在用C ++编写一个Bittorrent客户端,需要生成一个20字节的对等ID。前8个字符由-WW1000-
组成,表示客户端的名称和版本号。其他12位数字需要是每次客户端启动时需要随机生成的随机数。
我如何生成12位数的随机数并将其与包含前8个字符std::string
)的-WW1000-
连接?
答案 0 :(得分:5)
const string CurrentClientID = "-WW1000-";
ostringstream os;
for (int i = 0; i < 12; ++i)
{
int digit = rand() % 10;
os << digit;
}
string result = CurrentClientID + os.str();
答案 1 :(得分:2)
一种方法是使用rand()
N次制作一个大字符串,其中N是您想要的数字长度(a naive way to avoid modulo bias):
size_t length = 20;
std::ostringstream o;
o << "-WW1000-";
for (size_t ii = 8; ii < length; ++ii)
{
o << rand(); // each time you'll get at least 1 digit
}
std::string id = o.str().substr(0, length);
如果你有一个足够新的C ++编译器/库:
// #include <random>
std::random_device r;
std::mt19937 gen(r());
std::uniform_int_distribution<long long> idgen(0LL, 999999999999LL);
std::ostringstream o;
o << "-WW1000-";
o.fill('0');
o.width(12);
o << idgen(gen);
std::string id = o.str();
答案 2 :(得分:1)
我不知道你的身份有多“安全”,但因为你说:
that need to be generated randomly every time the client starts
,
您可能只是使用该信息(1970-01-01之后的秒数10位数)并添加另外两个随机数字(00..99):
using namespace std;
...
...
ostringstream id;
id << "-WW1000-" << setw(10) << setfill('0') << time(0) << setw(2) << rand()%100;
...
在我的系统上,此时将打印:
cout << id.str() << endl;
-WW1000-134306070741
如果您的要求更强,您当然应该使用基于完全随机的变体。