【发布时间】:2014-07-10 04:58:03
【问题描述】:
我有一个工具,每次启动时都需要创建一个唯一的目录。
此工具可以同时启动多次
当我使用常规的 srand(time(NULL)) 和 rand() 时,如果我的工具在同一秒内多次启动,我会得到相同的“唯一”字符串。
这是我的问题的一个例子:
$ ./rand_string.exe
9IQMT8F63P37G3LO4O85LM1LRTEBTV3Q1DOX3B46SAUYUBPYKDMZER9M8DAZSVPT
$ ./rand_string.exe
I01QZ47I0FV3WCW597NLE3M9B75Q5S5ADFB23T4OZR0W2VM2E91XJYHWGGVMEAE0
# Time is still the same, getting same "unique" string
$ ./rand_string.exe
I01QZ47I0FV3WCW597NLE3M9B75Q5S5ADFB23T4OZR0W2VM2E91XJYHWGGVMEAE0
# Time is still the same, getting same "unique" string
$ ./rand_string.exe
I01QZ47I0FV3WCW597NLE3M9B75Q5S5ADFB23T4OZR0W2VM2E91XJYHWGGVMEAE0
$ ./rand_string.exe
LWNXWSTODGGC8B46JB0ZII950LJOPJ8EG3GEI885U58CLXHA3L0DBCXIX6I0I2SZ
$ ./rand_string.exe
UUY1245J9RO8O1G6OVEYBZUTK0PNGG9ER52JIQSN1MEUDGZEXHFBHJ6R6TJ74H1Q
$ ./rand_string.exe
3SP49GYF6HG4KAS7UVTELWWG4FW28UAY384PI8CLP3ZS50WIRXFTMQEKEWKE6DQY
# Time is still the same, getting same "unique" string
$ ./rand_string.exe
3SP49GYF6HG4KAS7UVTELWWG4FW28UAY384PI8CLP3ZS50WIRXFTMQEKEWKE6DQY
这是我的代码(只是为了让“随机”实现有意义):
#include <cstdlib>
#include <ctime>
#include <iostream>
void cpy_rand_str(char *dest, int size) {
int i;
int rand_num;
srand (time(NULL));
for (i = 0 ; i < size ; i++) {
rand_num = rand() % 36;
if (rand_num >= 10) {
rand_num += ('A' - 10);
} else {
rand_num += '0';
}
dest[i] = (char)rand_num;
}
dest[size] = '\0';
}
int main() {
char my_key[64 + 1];
cpy_rand_str(my_key, 64);
std::cout << my_key << "\n";
return 0;
}
【问题讨论】:
-
因为
srand就是这样工作的。调用它将为生成的随机数设置种子。而种子取决于时间,到秒。所以每秒调用几次会产生相同的“随机”字符串。 -
混合一些独特的东西,比如 PID,或者带有更高分辨率计数器的种子。
-
@user3322273 如果允许 C++11,您也可以在
<random>标头中查看解决方案。 -
@Theolodis,还有多少兰特?如果我用
srand()对它进行 rand 它,我每次都会得到相同的“额外 rand” :) -
如您所见,
srand只适用于一次性玩具;不适合任何严肃的应用