乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      linux下真正的"偽隨機(jī)數(shù)"

       rookie 2012-04-10

            偽隨機(jī)數(shù),程序員哪個(gè)不知,哪個(gè)不曉。在linux下,設(shè)置好隨機(jī)種子,然后調(diào)用rand()函數(shù),但你真的知道了解它嗎?其實(shí)你錯(cuò)了,這個(gè)"偽"確實(shí)夠偽的,騙了很多人,不信,看如下代碼:

      1
      2
      3
      4
      5
      6
      7
      #include <stdio.h>
      #include <stdlib.h>
      int main(void) {
          srand(100);
          printf("%d\n",rand());
          return EXIT_SUCCESS;
      }

            你把代碼運(yùn)行10遍,發(fā)現(xiàn)啥了?咦,怎么每次的結(jié)果都一樣啊,這樣別人如果知道種子(100)了,就知道結(jié)果了,這樣的結(jié)果配叫隨機(jī)數(shù)啊。常用的方法就是 種子用時(shí)間來計(jì)算,但安全性不高,你我都知道你會(huì)用時(shí)間做種子算法,那還安全啊,我每次打游戲老怪就老蹲在一個(gè)地方打,反正你是"隨機(jī)坐標(biāo)"出來的怪獸 嘛!顯然問題相當(dāng)嚴(yán)重了,那咋辦?
            最簡(jiǎn)單的辦法:種子也用隨機(jī)數(shù)來表示。這,我不說你都知道問題了,本來就是求隨機(jī)數(shù)都沒出來,你還整個(gè)隨機(jī)種子,表妹知道肯定說打死我。哎,好在 linux給我們提供了“真正的”隨機(jī)數(shù),在內(nèi)核中,linux會(huì)維護(hù)一些偶然出現(xiàn)的數(shù)據(jù),并且為用戶提供訪問接口。之所以稱之為真正的隨機(jī)數(shù),是因?yàn)檫@ 些數(shù)據(jù)來源于計(jì)算機(jī)本身的偶然操作,比如硬盤操作、鍵盤和鼠標(biāo)的操作,等等。這些操作比起那些通過固定算法生成的偽隨機(jī)數(shù)來說,當(dāng)然是更真實(shí)一些了,它被 叫做“熵”。內(nèi)核提供的接口是/dev/random和/dev/urandom設(shè)備,二者的區(qū)別是讀取時(shí)random肯定會(huì)返回一個(gè)數(shù),如果沒有足夠的 數(shù)據(jù),就會(huì)阻塞。而urandom則不會(huì)阻塞,但是不保證返回的是合適的數(shù)據(jù)。下面就針對(duì)這兩個(gè)接口來看看真正的隨機(jī)數(shù)是怎么產(chǎn)生的:
            一,使用/dev/random接口,代碼如下:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      #include <stdio.h>
      #include <sys/time.h>
      #include <fcntl.h>
      unsigned int new_rand ()
      {
          int fd;
          unsigned int n = 0;
          fd = open ("/dev/random", O_RDONLY);
          if (fd > 0)
          {
              read (fd,&n,sizeof (n));
          }
          close (fd);
          return n;
      }
      int main ()
      {
          int n, i;
          //init_random ();
          srand(new_rand());
          n = rand ();
          printf ("n=%d ",rand());
          return 0;
      }

            這一種方法夠簡(jiǎn)單明了,通過讀取linux中真正的偽隨機(jī)接口/dev/random來真正的隨機(jī)產(chǎn)生種子,種子都隨機(jī)了,結(jié)果還不隨機(jī)啊。但問題明顯, 我剛說了,讀取時(shí)random肯定會(huì)返回一個(gè)數(shù),如果沒有足夠的數(shù)據(jù),就會(huì)阻塞。這個(gè)阻塞有時(shí)是會(huì)帶來安全問題的。
            二,使用/dev/urandom接口,代碼如下:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      #include <stdio.h>
      #include <sys/time.h>
      #include <fcntl.h>
      void init_random ()
      {
          unsigned int ticks;
          struct timeval tv;
          int fd;
          gettimeofday (&tv, NULL);
          ticks = tv.tv_sec + tv.tv_usec;
          fd = open ("/dev/urandom", O_RDONLY);
          if (fd > 0)
          {
              unsigned int r;
              int i;
              for (i = 0; i < 512; i++)
              {
                  read (fd, &r, sizeof (r));
                  ticks += r;
              }
              close (fd);
          }
          srand (ticks);
      }
       
      int main ()
      {
          int n, i;
          init_random ();
          n = rand ();
          printf ("n=%d ", n);
          return 0;
      }

            這個(gè)方法相比較第一種而言,很明顯獲取隨機(jī)種子時(shí)麻煩一些,表現(xiàn)在居然循環(huán)了512次,遮掩做主要是因?yàn)閯傉f過讀取/dev/urandom設(shè)備會(huì)立即返回,但并不保證會(huì)得到合適的數(shù),所以多做幾次,保證能獲得需要的數(shù)。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多