- 伪随机法
伪随机法就是通过一个确定性的算法来获取看似随机或者乱序,在计算伪随机序列时,如果使用的开始值不变化的,实际上获取到的随机序列的值顺序是保持不变。例如在C中比较常用的随机函数rand(),是比较典型的伪随机法。
在调用rand()函数时,没有显示的调用srand()函数来设置随机序列开始种子的话,默认随机序列的种子即为1,此时的随机序列为:1804289383
846930886、1681692777、1714636915、1957747793、424238335、719885386、1649760492。
rand()函数是实现在glibc库中,运行于用户态,运行效率比较高效;
- 真随机法
真随机法,在在计算机环境中,主要是依赖于计算机环境中的背景操作,例如来自驱动程序或者其他来源的背景噪声。真随即法具有不可预测和再现性,原因在于产生随机数的操作系统所处的环境充满了未知性。在Linux中,/dev/random产生的是真正的随机数序列。
随机函数发生器通过驱动程序或者其他来源来获取环境噪声来计算出一个随机数,同时将产生的随机数放入到随机数池中,每次需要随机数时,从池中获取一个数据数即可,如果随机池已空,从/dev/random读取数据时,将会被阻塞,直到新的随机数被放入到池中才会返回,这个地方无疑是个巨大的坑,当面对大量的请求需要随机数时。
/dev/unrandom,也是从随机池中获取一个随机数,与/dev/random的区别点在于随机池为空时,随机数的程度不够高。
调用/dev/(u)random获取随机数的方法,相比rand()方法效率会低很多,每获取一次random值,均需要发起一次系统调用,来调用该值。
示例代码为:
FILE *fs_p = NULL;
fs_p = fopen ("/dev/urandom", "r");
fread(&seed, sizeof(int), 1, fs_p); //obtain oneunsigned int data
fclose(fs_p);