- 1.随机种子和随机数的关系
- 2.生成随机数
既然都有随机数了,那我要随机种子干嘛用?来,用实例告诉你有啥用。
#include#include #include using namespace std; void main() { // srand((int)time(0)); for (int i = 0; i < 10; ++i) { cout< 如果就上面的函数,不管什么时候运行这个程序,返回都会是相同的数。
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



