在C语言获取随机数

-- TOC --

在C语言中,我们可以使用srand和rand接口来获取随机数,Linux环境下也可以通过读取/dev/random来获取随机数。

srand和rand

在使用rand接口之前,一定要先用srand设一个seed,否则每次程序启动,rand返回的随机序列都是一样的。

void srand(unsigned int seed)
int rand(void)

下面是一段示例代码,用时间来作为seed:

$ cat rand.c
#include <stdio.h>
#include <time.h>
#include <stdlib.h>


int main(void) {
    time_t t;
    time(&t);
    srand((unsigned int)(t%0xFFFFFFFF));
    int i;
    for (i=0; i<5; ++i)
        printf("random: %d\n", rand());
    /* random number between 0-255 */
    for (i=0; i<5; ++i)
        printf("random: %d\n", rand()%256);
    return 0;
}

测试发现,貌似rand不会返回负数;由于time(&t)得到的秒数,如果在一秒内多次执行这段代码,得到的随机数全部相同。

sizeof(time_t)是8,用t%0xFFFFFFFF,是为了这段代码几千年后的安全:)

读取/dev/random

请看示例代码:

$ cat rand2.c
#include <stdio.h>


int main(void) {
    FILE *fp = fopen("/dev/random", "rb");
    unsigned char a;
    unsigned int b;
    int i;
    for (i=0; i<5; ++i) {
        fread(&a, 1, 1, fp);
        printf("random uchar: %u\n", a);
    }
    for (i=0; i<5; ++i) {
        fread(&b, 4, 1, fp);
        printf("random uint: %u\n", b);
    }
    fclose(fp);
    return 0;
}

需要多大的随机数,其实就是从/dev/random读取多少个byte。

读取/dev/urandom

没搞得太懂,据说现在都是用urandom来获取随机数。方式如上。

关于/dev/{random,urandom}

本文链接:https://cs.pynote.net/sf/c/202206241/

-- EOF --

-- MORE --