<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)隨機(jī)數(shù):rand(),srand()

          單片機(jī)隨機(jī)數(shù):rand(),srand()

          作者: 時(shí)間:2016-11-18 來(lái)源:網(wǎng)絡(luò) 收藏
          從書(shū)中看到rand()函數(shù)返回的是0~32767之間的偽隨機(jī)數(shù)。srand設(shè)置該偽隨機(jī)數(shù)的初值。
          在正常使用中,大多數(shù)的使用場(chǎng)景是:
          1. 求0~max;
          2. 求min~max;
          順手些了幾個(gè)函數(shù),作為擴(kuò)展。C不支持可變參數(shù),也不支持overloard,所以只能用不同的函數(shù)名稱(chēng)表示。當(dāng)然也可以傳入個(gè)hash的數(shù)據(jù)結(jié)構(gòu)作為參數(shù)(ruby like)。

          int rand_with_min_max(int min,int max)
          {
          return ((rand()/max) + min);
          }
          int rand_with_min(int min)
          {
          srand(min);
          return rand();
          }
          int rand_with_max(int max)
          {
          return (rand()/max);
          }

          本文引用地址:http://www.ex-cimer.com/article/201611/315895.htm

          srand()就是給rand()提供種子seed

          如果srand每次輸入的數(shù)值是一樣的,那么每次運(yùn)行產(chǎn)生的隨機(jī)數(shù)也是一樣的,

          srand(n)

          for(10)

          rand()
          也就是說(shuō),以一個(gè)固定的數(shù)值作為種子是一個(gè)缺點(diǎn)。 通常的做法是以這樣一句代碼srand((unsigned) time(NULL));來(lái)取代,這樣將使得種子為一個(gè)不固定的數(shù), 這樣產(chǎn)生的隨機(jī)數(shù)就不會(huì)每次執(zhí)行都一樣了。


          1,先看一個(gè)例子
          #include
          #include
          #include
          using namespace std;
          int main( void )
          {
          int i;
          /* Seed the random-number generator with current time so that
          * the numbers will be different every time we run.
          */
          srand( (unsigned)time( NULL ) );
          /* Display 10 numbers. */
          for( i = 0; i < 10;i++ )
          printf( " %6d/n", rand() );
          }

          2.關(guān)于time.h
          time.h中包含很多有趣的函數(shù),譬如
          char *ctime(long *clock)
          本函數(shù)把clock所指的時(shí)間(如由函數(shù)time返回的時(shí)間)轉(zhuǎn)換成下列格式的
          字符串:Mon Nov 21 11:31:54 1983/n/0

          #i nclude
          #i nclude
          #i nclude
          using namespace std;


          void main()
          {
          time_t t1,t2;
          char getTime[20];
          char *ptstring=getTime;

          int x,count=0;
          x=RAND_MAX;
          cout<<t1=time(NULL);
          ptstring=ctime(&t1);

          while(count<=100)
          {
          srand( (unsigned)time( NULL ) );
          x=rand()%50;
          if(x<5)
          continue;
          else
          {
          count++;
          cout<<"the numth is "<<}
          }

          查看ptstring的值會(huì)顯示 "Tue Sep 13 16:31:06 2005"

          3, 最后說(shuō)說(shuō)srand()函數(shù)
          void srand(unsigned seed) 初始化隨機(jī)數(shù)發(fā)生器

          有討論如下:
          1.C的函數(shù)庫(kù)之所以沒(méi)有把使用系統(tǒng)時(shí)鐘初始化隨機(jī)種子這步重要的操作直接放進(jìn)ran

          d函數(shù)的實(shí)現(xiàn)中,我覺(jué)得至少有三個(gè)原因:
          (1)可以高效產(chǎn)生連續(xù)的隨機(jī)數(shù),不用每次都初始化;
          (2)給程序員以更高的靈活性,因?yàn)榭赡茉谝筝^高的場(chǎng)合,應(yīng)該使用更好的的數(shù)據(jù)

          做種子,而不是系統(tǒng)時(shí)鐘;
          (3)對(duì)于只是想產(chǎn)生大量偽隨機(jī)數(shù)來(lái)盡興某種驗(yàn)證或者統(tǒng)計(jì),未必需要初始化,大不

          了程序每次運(yùn)行都產(chǎn)生同樣的一系列隨機(jī)數(shù)而已——有些情況下,這是無(wú)所謂的。

          事實(shí)上有一個(gè)更重要的原因:
          作為偽隨機(jī)序列產(chǎn)生器的rand()函數(shù),必須具備的一個(gè)重要特性就是-》產(chǎn)生的序

          列必須是可重現(xiàn)的。
          這不僅僅是一個(gè)算法,相當(dāng)大的程度上,它關(guān)系到代碼測(cè)試的準(zhǔn)確性。如果算法中

          使用了和rand()的結(jié)果相關(guān)的數(shù)據(jù),通過(guò)一個(gè)可控的可重現(xiàn)序列,我們就有機(jī)會(huì)再現(xiàn)每一

          次測(cè)試的過(guò)程,從而更有效的找到問(wèn)題的所在。
          所以這里提出一個(gè)建議,代碼中,如果rand()的函數(shù)結(jié)果關(guān)系到算法的結(jié)果,那么

          ,必須保證你的rand()調(diào)用是可重現(xiàn)的。

          4,c語(yǔ)言里函數(shù)rand()和srand()的用法 - -

          rand(void)用于產(chǎn)生一個(gè)偽隨機(jī)unsigned int 整數(shù)。
          srand(seed)用于給rand()函數(shù)設(shè)定種子。

          srand 和 rand 應(yīng)該組和使用。一般來(lái)說(shuō),srand 是對(duì) rand 進(jìn)行設(shè)置。
          比如:
          srand((UINT)GetCurrentTime());
          int x = rand() % 100;
          是生成 0 到 100 之間的隨機(jī)數(shù)。

          srand()是用來(lái)初始化隨機(jī)種子數(shù)的,因?yàn)閞and的內(nèi)部實(shí)現(xiàn)是用線性同余法做的,他不是真

          的隨機(jī)數(shù),只不過(guò)是因?yàn)槠渲芷谔貏e長(zhǎng),所以有一定的范圍里可看成是隨機(jī)的,式子如下


          rand = rand*const_1 + c_var;
          srand函數(shù)就是給它的第一個(gè)rand值。

          用"int x = rand() % 100;"來(lái)生成 0 到 100 之間的隨機(jī)數(shù)這種方法是不或取的,
          比較好的做法是: j=(int)(n*rand()/(RAND_MAX+1.0))   產(chǎn)生一個(gè)0到n之間的隨機(jī)

          數(shù)
          RAND_MAX=0x7fffffff

          5.總結(jié)
          1)srand()給rand()提供種子
          2)srand()中的seed一般由時(shí)間函數(shù)得,eg srand((UINT)GetCurrentTime()) srand( (u

          nsigned)time( NULL ) ) time()函數(shù)得到現(xiàn)在的系統(tǒng)時(shí)間...等等




          關(guān)鍵詞: 單片機(jī)隨機(jī)

          評(píng)論


          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();