linux中使用随机数
1. 随机数和伪随机数
- 随机数:随机数是随机出现,没有任何规律的一组数列。
- 伪随机数:真正的完全随机的数列是不存在的,只是一种理想情况。我们平时要用到随机数时一般只能通过一些算法得到一个伪随机数序列。
- 我们平时说到随机数,基本都指的是伪随机数。
2.linux中随机数相关API
- 连续多次调用rand函数可以返回一个伪随机数序列
- srand函数用来设置rand获取的伪随机序列的种子
3.rand/srand函数
-
单纯使用rand重复调用n次,就会得到一个
0-RAND_MAX
之间的伪随机数,如果需要调整范围,可以得到随机数序列后再进行计算。 -
单纯使用rand来得到伪随机数序列有缺陷,每次执行程序得到的伪随机序列是同一个序列,没法得到其他序列。
-
原因:因为rand内部的算法其实是通过一个种子(seed,其实就是一个原始参数,int类型),rand内部默认是使用1作为seed的,种子一定的算法也是一定的,那么每次得到的伪随机序列肯定是同一个。
-
所以要想每次执行这个程序获取的伪随机序列不同,则每次都要给不同的种子。用srand函数来设置种子。
-
总结和说明
- 在每次执行程序时,先用srand设置一个不同的种子,然后再多次调用rand获取一个伪随机序列,这样就可以每次都得到一个不同的伪随机序列。
- 一般常规做法是用time函数的返回值来做srand的参数。
4.在linux系统中获取真正的随机数
- linux系统收集系统中的一些随机发生的事件的时间(譬如有人动鼠标,譬如触摸屏的操作和坐标等)作为随机种子去生成随机数序列。
//使用rand和srand函数获取随机数
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char *argv[])
{
int ret = 0;
if (2 != argc)
{
printf("we need 2 param.\n");
return -1;
}
//atio()将字符转化为int类型
srand(atoi(argv[1]));
ret = rand();
printf("rand = %d\n", ret);
return 0;
}