本人近期在做项目在线版本的C/S部署,在服务器端需要传送文件,系统要求文件名字唯一。我的实现方法是随机数+时间+客户IP。其中时间格式的“:”需要替换,否则windows系统认为不合理。对于随机数的产生我的理解一直停滞于20年前谭浩强的<<c语言程序设计>>水平。直到看到以下这篇文章才有了新的认识。在此谢谢现实虚拟的博客。
注:以下内容转载自网易 --现实虚幻的博客。在此谢谢。以下是原文:
程序段1:
//包含头文件
void main() {
int count=0;
for (int i=0;i <10;i++){
srand((unsigned)time(NULL));
count++;
cout < < "No " < <count < < "= " < <rand() < < " ";
if (!(count%5)) cout < <endl;
}
}
程序段2:
//包含头文件
void main() {
int count=0;
srand((unsigned)time(NULL));
for (int i=0;i <10;i++){
count++;
cout < < "No " < <count < < "= " < <rand() < < " ";
if (!(count%5)) cout < <endl;
}
}
程序段1的运行结果为:
No1=9694 No2=9694 No3=9694 No4=9694 No5=9694
No6=9694 No7=9694 No8=9694 No9=9694 No10=9694
程序段2的运行结果为:
No1=10351 No2=444 No3=11351 No4=3074 No5=21497
No6=30426 No7=6246 No8=24614 No9=22089 No10=21498
可以发现,以上两个程序段由于随机数生成时选择的种子的不同,运行的结果也不一样。rand()函数返回随机数序列中的下一个数(实际上是一个伪随机数序列,序列中的每一个数是由对其前面的数字进行复杂变换得到的)。为了模仿真正的随机性,首先要调用srand()函数给序列设置一个种子。为了更好地满足随机性,使用了时间函数time(),以便取到一个随时间变化的值,使每次运行rand()函数时从srand()函数所得到的种子值不相同。伪随机数生成器将作为 "种子 "的数当作初始整数传给函数。这粒种子会使这个球(生成伪随机数)一直滚下去。
程序段1中由于将 srand()函数放在循环体内,而程序执行的CPU时间较快,调用time函数获取的时间精度却较低(55ms),这样循环体内每次产生随机数用到的种子数都是一样的,因此产生的随机数也是一样的。而程序段2中第1次产生的随机数要用到随机种子,以后的每次产生随机数都是利用递推关系得到的。
注:以下内容转载自网易 --现实虚幻的博客。在此谢谢。以下是原文:
程序段1:
//包含头文件
void main() {
int count=0;
for (int i=0;i <10;i++){
srand((unsigned)time(NULL));
count++;
cout < < "No " < <count < < "= " < <rand() < < " ";
if (!(count%5)) cout < <endl;
}
}
程序段2:
//包含头文件
void main() {
int count=0;
srand((unsigned)time(NULL));
for (int i=0;i <10;i++){
count++;
cout < < "No " < <count < < "= " < <rand() < < " ";
if (!(count%5)) cout < <endl;
}
}
程序段1的运行结果为:
No1=9694 No2=9694 No3=9694 No4=9694 No5=9694
No6=9694 No7=9694 No8=9694 No9=9694 No10=9694
程序段2的运行结果为:
No1=10351 No2=444 No3=11351 No4=3074 No5=21497
No6=30426 No7=6246 No8=24614 No9=22089 No10=21498
可以发现,以上两个程序段由于随机数生成时选择的种子的不同,运行的结果也不一样。rand()函数返回随机数序列中的下一个数(实际上是一个伪随机数序列,序列中的每一个数是由对其前面的数字进行复杂变换得到的)。为了模仿真正的随机性,首先要调用srand()函数给序列设置一个种子。为了更好地满足随机性,使用了时间函数time(),以便取到一个随时间变化的值,使每次运行rand()函数时从srand()函数所得到的种子值不相同。伪随机数生成器将作为 "种子 "的数当作初始整数传给函数。这粒种子会使这个球(生成伪随机数)一直滚下去。
程序段1中由于将 srand()函数放在循环体内,而程序执行的CPU时间较快,调用time函数获取的时间精度却较低(55ms),这样循环体内每次产生随机数用到的种子数都是一样的,因此产生的随机数也是一样的。而程序段2中第1次产生的随机数要用到随机种子,以后的每次产生随机数都是利用递推关系得到的。