如何產生指定範圍的隨機數

crjmail發表於2018-08-01

這兩個函式的使用都要包含標頭檔案stdio.h

rand()函式返回的是一個0到RAND_MAX的隨機數,RAND_MAX 這是一個常數,它的值在windows和linux下是不同的。在我的機子上這個值是32767,也就是說,在我的機子上,rand() 這個函式會返回一個0到32767的隨機數。(這裡不討論返回的是不是真正意義上的隨機數的問題,只討論它的用法。)

產生某個區間的隨機數

如果我們需要這個函式產生某個區間的隨機數怎麼做呢?首先我們看看rand() 函式原型:int rand(void),可以看出這個函式不接受任何引數,那麼怎麼讓他產生某個區間的隨機呢?

通用的公式是這樣的:n+rand()%m ,這個公式的意思產生區間[n,n+m)的隨機數,即包括n到不包括m之間的隨機數。由區間可以看出,式子中n 是區間的開始,m你想要的區間的差。 


這個通用公式也很容易理解,因為rand() 這個函式不接受任何引數,所以他本身始終表示0到RAND_MAX的隨機數,所以我們可以在它產生預設隨機數的基礎上加n,就是想要的區間的起始,在用m表示區間的結束。

 
需要注意的是,這樣的產生的隨機數預設是左閉右開的:[n,m)

srand函式

這個函式通常和rand()函式配合使用以達到最好的隨機數效果。它的原型是:void srand(unsigned int seed),為函式rand() 提供隨機數種子。這個函式要在rand() 呼叫之前呼叫,才能達到應有的效果。

 

舉例:


void rand_function(void)
{
	char param_out[256]={0};
	u8 data[256]={0};
	float n=0;
	u16 m=0;
	m= After_filter[0] %100;;
	srand(m);
	n=rand()%10+5;
  
	Coefficient=(float)(1/n);
	
//	sprintf(param_out,":n=%f,adc0=%d\r\n",n,After_filter[0]);
//	strcat((char*)data,param_out);	
//	USART1_SendData(data,100);
}

 

相關文章