随机数是个好东西......
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