程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C說話編程中生成隨機數的入門教程

C說話編程中生成隨機數的入門教程

編輯:關於C++

C說話編程中生成隨機數的入門教程。本站提示廣大學習愛好者:(C說話編程中生成隨機數的入門教程)文章只能為提供參考,不一定能成為您想要的結果。以下是C說話編程中生成隨機數的入門教程正文


說話發生隨機數是一個罕見的編程功效義務,固然這個也不難,挪用兩三個函數就出來了,然則你曉得這些函數詳細是起到如何的感化,而且是它們是若何發生隨機數的嗎?

幾個概念

隨機數:數學上發生的都是偽隨機數,真實的隨機數應用物理辦法發生的。

隨機數種子:隨機數的發生是由算術規矩發生的,srand(seed)的隨機數種子分歧,rand()的隨機數值就分歧,倘使每次的隨機數種子一樣,則rand()的值就一樣。所以要發生隨機數,則srand(seed)的隨機數種子必需也要隨機的。

用srand()發生隨機數種子

原型:void srand ( unsigned int seed );

感化是設置好隨機數種子,為了讓隨機數種子是隨機的,平日用time(NULL)的值來當seed。


time()用於隨機數種子

函數原型:time_t time ( time_t * timer );

time()函數表現前往1970-1-1 00:00:00 到以後時光的秒數。

用的時刻如許:srand(unsigned(time(NULL)));例如發生1~10之間的隨機整數

#include <stdlib.h>
#include <time.h>

int main()
{
  srand(time(NULL));
  for(int i=0;i < 10;i++)
  {
    int randValue=rand()%10;
  }
}

下面的法式中要留意srand是在for輪回裡面的,假如把srand放到for輪回外面,則每次發生的隨機數都雷同。

用rand()發生隨機數

原型:int rand ( void );

感化是發生一個隨機數,固然隨機數是有規模的,為0~RAND_MAX之間,隨機數與隨機數種子有關。詳細來講是,在發生隨機數 rand()被挪用的時刻,它會如許履行:

假如用戶之前挪用過 srand(seed)的話,他會從新挪用一遍 srand(seed)以發生隨機數種子;
假如發明沒有挪用過 srand(seed)的話,會主動挪用 srand(1)一次。
假如挪用srand(seed)發生的隨機數種子是一樣的話(即seed的值雷同),rand()發生的隨機數也雷同。
所以,假如願望rand()每次挪用發生的值都紛歧樣,就須要每次挪用srand(seed)一次,並且seed不克不及雷同。這裡就是常常采取time(NULL)發生隨機數種子的緣由。

C說話中可使用rand()函數來生成一個從0到RAND_MAX的uniform散布。基於這個函數,我們可以結構出一些特定的隨機數生成器來知足我們的需求。
(一)0到1的uniform散布:

//generate a random number in the range of [0,1]
double uniform_zero_to_one(){
  return (double)rand()/RAND_MAX;
}

(二)隨意率性實數區間的uniform散布:

//generate a random real number in [start,end]
double uniform_real(double start,double end){
  double rate=(double)rand()/RAND_MAX;
  return start+(end-start)*rate;
}

(三)隨意率性整數區間的uniform散布:

//generate a random integer number in [start,end)
int uniform_integer(int start,int end){
  int base=rand();
  if(base==RAND_MAX)
    return uniform_integer(start,end);
  int range=end-start;
  int remainder=RAND_MAX%range;
  int bucket=RAND_MAX/range;
  if(base<RAND_MAX-remainder)
    return start+base/bucket;
  else
    return uniform_integer(start,end);
}

這個函數要特殊解釋一下,平凡時刻我們都是用rand()%n來生成0到n-1的隨機數,然則按這類辦法生成的散布其實不是uniform的,別的因為RAND_MAX只要32767,是以要生成比這個數更年夜的隨機數須要別的想方法,實際上可以直接用0到1的uniform散布直接放縮,但現實後果欠好。這裡給出一種移位方法的完成。

(四)32bits的隨機數

//generate a random 32 bits integer number 
int rand32(){
  return ((rand()<<16)+(rand()<<1)+rand()%2);
}

有了32bits的隨機數生成辦法,便可以結構32bits規模內的隨機整數區間了,辦法和之前16bits的情形一樣。

(五)32bits規模內的隨機整數區間

//generate a random 32bits integer number in [start,end)
 int uniform_integer_32(int start,int end){
   int base=rand32();
  if(base==RAND32_MAX)
    return uniform_integer_32(start,end);
  int range=end-start;
  int remainder=RAND32_MAX%range;
  int bucket=RAND32_MAX/range;
  if(base<RAND32_MAX-remainder)
    return start+base/bucket;
  else
    return uniform_integer_32(start,end);
}

這裡RAND32_MAX界說為0x7fffffff。

除此以外,應用rand()函數結構隨意率性散布的隨機數也是個值得商量的成績。

實際上可以經由過程(0,1)的uniform散布,加上尺度采樣辦法(sampling)取得。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved