以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。
一、随机数和伪随机数
随机数是随机出现,没有任何规律的一组数列。真正的完全随机的数列是不存在的,只是一种理想情况。我们一般只能通过一些算法得到一个伪随机数序列。平时说到随机数,基本都指的是伪随机数。
二、Linux中随机数相关API
#include <stdlib.h>int rand(void); int rand_r(unsigned int *seedp); void srand(unsigned int seed);
1、rand函数:连续多次调用rand函数可以返回一个伪随机数序列。
单纯使用rand重复调用n次,就会得到一个0-RAND_MAX之间的伪随机数序列,如果需要调整范围,可以得到随机数序列后再进行计算。单纯使用rand来得到伪随机数序列是有缺陷的,因为每次执行程序得到的伪随机序列是同一个序列,没法得到其他序列。
2、srand函数:用来设置rand获取的伪随机序列的种子。
rand内部的算法是通过一个种子(seed,其实就是一个原始参数,int类型)决定的,rand内部默认使用1作为seed,种子一定则算法也是一定的,那么每次得到的伪随机序列肯定是同一个。要想每次执行这个程序获取的伪随机序列不同,则每次都要给不同的种子。srand函数实现此功能。
3、代码示例
在每次执行程序时,先用srand设置一个不同的种子(一般使用time函数的返回值作为种子),然后再多次调用rand获取一个伪随机序列,这样就可以每次都得到一个不同的伪随机序列。
#include <stdio.h> #include <stdlib.h>int main(int argc, char **argv) {int i = 0, val = 0;/* if (argc != 2){printf("usage: %s num\n", argv[0]);return -1;} */ printf("RAND_MAX = %d.\n", RAND_MAX); // 2147483647//srand(atoi(argv[1]));srand(time(NULL));for (i=0; i<6; i++){val = rand();printf("%d ", (val % 6));}printf("\n");return 0; }
4、如何在linux系统中获取真正的随机数?
linux系统收集系统中的一些随机发生的事件的时间(有人动鼠标、触摸屏的操作和坐标等)作为随机种子去生成随机数序列。