• 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

  • 相关阅读:
    四则运算
    androidstdio导入工程报错
    日程代码任务1
    软件团队模式选择
    初识软件工程
    java数组中最大的子数组之和
    解决键盘布局错误(日文系统)
    固态硬盘的更替
    ZendDebugger的配置
    apache命令行启动
  • 原文地址:https://www.cnblogs.com/cloudstorage/p/2588122.html
Copyright © 2020-2023  润新知