在编程中,有时会使用随机数。 本文介绍如何在Linux编程环境中生成伪随机数。
伪随机数是什么?伪随机数实际上不是随机的,因为通过确定性算法计算的“似是”是随机数列。 计算伪随机数时,只要初始值不变,伪随机数的顺序也不变。
伪随机数的优点要生成真随机数,必须使用专用设备,如热噪声信号、量子力学效应、放射性元素衰减辐射或不可预测现象的使用。 由于伪随机数的计算比较简单,不需要外部特殊硬件的支持,计算机科学中仍然使用伪随机数。
伪随机数的缺点在某些方面不可用,因为伪随机数不是真随机数。 请注意,例如,在密码学中使用伪随机数时,可计算性是可攻击的位置。 在统计学、asjddy法中所使用的伪随机数也必须选择周期极长、随机性足够高的随机性函数,以便计算结果有充分的随机性。
rand ) )函数生成伪随机数函数原型:
必须包含//头文件stdlib.hintrand(void )的Linux rand ()函数返回介于0和RAND_MAX之间的随机值。 此处RAND_MAX的定义为stdlib.h (如下图的128行所示,值为2147483647(2^31-1 ) )。
下面的示例使用rand ) )函数生成伪随机数:
# include stdlib.h # include stdio.h # define rand _ num 5int main (int argc,char*argv[](for(intI=0); i RAND_NUM; I ) printf('%d”,rand ); printf((n ); 返回0; }编译后连续运行两次,结果如下。
$./rand 18042893838469308861681692771714636915195747793 $./rand 1804289388616816927717146369157477793为什么
计算机生成的伪随机数可以用递归的方法获得,需要初始值,也就是通常所说的种子。 如果不初始化种子,计算机将使用默认值。 由于两次执行初始值相同,递归公式也相同,因此有完全相同的伪随机序列。
rand ) )函数时,如果未设置随机数种子,则rand ) )在调用时自动将随机数种子设置为1。
为了避免这种结果,每次运行程序时都必须初始化种子,初始值必须不同(例如到目前为止的经过时间)。
获取当前时间(以秒为单位)函数的原型:
//必须包含头文件time.htime_ttime(time ) t*timer; time_t其实是一个很长的整形。
time_ttime(time_t*timer )函数的用法如下:
如果参数为NULL,则返回1970年1月1日0时0分0秒到该时间的秒数; 如果参数不为NULL,则返回的值不仅存储在1970年1月1日0时0分0秒到该时间的秒数中,还存储在参数指定的time_t类型的变量中。
设置种子函数原型:
//必须包含头文件stdlib.hvoidsrand (未指定); srand函数以种子值为参数。 与函数time_ttime(time_t*timer )组合使用时,可以按如下方式设置种子:
srand ((未指定的int ) time ) null ); 代码# include stdlib.h # include stdio.h # include time.h # define rand _ num 5int main (int argc,char *argv[] () srand i RAND_NUM; I ) printf('%d ',rand ) )0); printf((n ); 返回0; }实验结果如下。
$./rand 6171643513 $./rand 5011834369 $./rand 6832359483【完】
参考资料http://txgcwm.github.io/blog/2013/07/07/Linux下雅- cyu-Yan-Wei-sui-Ji-Shu-bian-cheng /
https://zh .维基百科. org /维基/伪随机
3359 blog.csdn.net/duyi wuer 2009/article/details/49497199
33558 www.cplusplus.com/reference/c stdlib/srand/kw=srand
http://blog.jobbole.com/108049/