Linux下随机数

随机数是个好东西......
1. 通过系统时间
shell下通过命令:date +%s 获取秒数,date +%N 获取微妙。

vm2207:~ # date +%s
1313917706
vm2207:~ # date +%N
916630000

PHP中,time(), microtime();

 1 <?php 
 2 function microtime_float() {     
 3     list($usec, $sec) = explode(" ", microtime());     
 4     return ((float)$usec + (float)$sec);
 5 } 
 6 $time_micro = microtime_float(); 
 7 echo $time_micro,"\n"; # 1313918504.9907 
 8 echo time(),"\n";    # 1313918504 
 9 echo microtime(),"\n";  # 0.99079800 1313918504 
10 echo $_SERVER['REQUEST_TIME'];   # 1313918504 
11 ?>

Perl中,通过time()获取秒数,gettimeofday()获取微妙。

1 #!/usr/bin/perl
2 use Time::HiRes qw(gettimeofday);
3 ($sec, $usec) = gettimeofday;
4 print $sec,"  ",$usec,"\n";  # 1313919786  389419
5 print time(),"\n";  # 1313919786

2. 函数或变量
php, perl中有一堆的rand函数。
shell下有echo $RANDOM。

3. /dev/random 和 /dev/urandom
前者真随机(系统记录一下随机事件,一些硬件的interrupts),后者很真的伪随机。具体用法的话,如果Linux中的熵用完了,前者会挂起,等待新的随机事件发生并产生随机变量;而后者不会挂起。
可以通过cat /proc/sys/kernel/random/entropy_avail 查看熵的多少。
读取/dev/random,生产随机数的C语言实现:

 1 #include <stdio.h>
 2  
 3 int main( int argc, char** args )
 4 {
 5     unsigned long* seed = malloc( sizeof( unsigned long ) );
 6     FILE* file = fopen("/dev/random", "r");
 7     printf( "%d\n", sizeof( unsigned long ) );
 8     int i;
 9     for( i = 0; i < 9999; ++i)
10     {
11         fread( seed, 1, sizeof( unsigned long ), file );
12         printf( "%lld\n", *seed );
13     }
14     return 1;
15 }

可以看到当使用/dev/random时,会有等待出现;使用/dev/urandom则不会。
运行上述程序,然后
vm2207:/home/random # cat /proc/sys/kernel/random/entropy_avail
163
才162个,一般有4K多个。

也可以在shell中通过
head -200 /dev/urandom | cksum
head -200 /dev/urandom | cksum | cut -f1 -d” ”
来获取随机数。

参考:

http://www.cnblogs.com/chengmo/archive/2010/10/23/1858879.html

http://hi.baidu.com/jrckkyy/blog/item/9e29c9cb8f283f0ebf09e600.html

http://www.orawh.com/31.html

原文地址:https://www.cnblogs.com/cloudstorage/p/2588122.html