随机数叔叔

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

Guess you like

Origin blog.csdn.net/qigezuishuaide/article/details/120657446