文章目录
1.随机种子和随机数的关系
既然都有随机数了,那我要随机种子干嘛用?来,用实例告诉你有啥用。
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
void main()
{
// srand((int)time(0));
for (int i = 0; i < 10; ++i)
{
cout<<rand()<<" ";
}
cout<<endl;
}
如果就上面的函数,不管什么时候运行这个程序,返回都会是相同的数。
rand()的功能是产生随机值,从srand (seed)中指定的seed开始,返回一个[seed, RAND_MAX(0x7fff))间的随机整数。
srand()的功能是产生rand()的种子,用来初始化rand()的起始值。
可以认为rand()在每次被调用的时候,它会查看:
1) 如果用户在此之前调用过srand(seed),给seed指定了一个值,那么它会自动调用srand(seed)一次来初始化它的起始值。
2) 如果用户在此之前没有调用过srand(seed),它会自动调用srand(1)一次。
虽然如果我想一次生成多个随机字符串,并不需要多次执行srand(),一次srand,多次rand就可以
2.生成随机数
重点是随机数种子怎么选择,可以使用下面的方法就time函数
srand((unsigned)time(NULL));
rand()%(up-down+1)+down;
这个是生成[down,up]范围的随机数。注意,随机数种子只能生成一次。我之前写了一个随机数生成函数,这两部都有,也就是说每次进入生成随机数的函数都是先生成种子再生成随机数,结果运行时所有数据都是一样的,根本不随机,但是调试的时候就是随机的了,这就是次次都生成种子造成的
但是如果不想用时间呢?可以用**/dev/urandom和/dev/random**,下面是个demo
unsigned long random_xid(void)
{
static int initialized;
if (!initialized) {
int fd;
unsigned long seed;
fd = open("/dev/urandom", 0);
if (fd < 0 || read(fd, &seed, sizeof(seed)) < 0) {
LOG(LOG_WARNING, "Could not load seed from /dev/urandom: %s",
strerror(errno));
seed = time(0);
}
if (fd >= 0) close(fd);
//设置随机种子
srand(seed);
//下次取同样的随机数
initialized++;
}
return rand();
}
https://blog.csdn.net/wu_cai_/article/details/90168085?utm_medium=distribute.pc_relevant.none-task-blog-2defaultCTRLISTdefault-1.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2defaultCTRLISTdefault-1.no_search_link
https://blog.csdn.net/hulifangjiayou/article/details/47679841