-- TOC --
在C语言中,我们可以使用srand和rand接口来获取随机数,Linux环境下也可以通过读取/dev/random来获取随机数。
在使用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,是为了这段代码几千年后的安全:)
请看示例代码:
$ 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。
没搞得太懂,据说现在都是用urandom来获取随机数。方式如上。
本文链接:https://cs.pynote.net/sf/c/202206241/
-- EOF --
-- MORE --