① 關於c語言隨機函數
把 srand( time(0) ); 放在循環外每次產生隨機數的種子也是一樣的啊,為什麼產生的隨機數就不一樣了?
因為隨機函數只需要一個種子就能產生一系列的隨機數,並不是每個隨機數都需要一個種子。
你把 srand(time(0)) 放到循環前面就可以了。
原因: time(0)返回的是系統的時間(從1970.1.1午夜算起),單位:秒,而那個循環運行起來耗時連0.000001秒都不到! 也就是說,srand(time(0)) 連著4次的種子是一樣的,種子一樣,生產的隨機數當然是一樣了。
如果你在把srand()放循環裡面,在中間加個sleep函數,消耗一點時間(間隔大於1秒),那麼生成的rand 就不一樣了.但是這樣做很不好,連著兩次用srand生成的種子,間隔一樣,生產的隨機數間隔有會有規律性。
另:因為兩次運行同一程序的時間肯定是不一樣的,所以把srand放在循環前面可以得不同的種子,這樣才能得到你想要的。
② C語言怎樣產生一定范圍的隨機數
在C語言中,rand()函數可以用來產生隨機數,但是這不是真真意義上的隨機數,是一個偽隨機數,是根據一個數,可以稱它為種子。
為基準以某個遞推公式推算出來的一系數,當這系列數很大的時候,就符合正態公布,從而相當於產生了隨機數。
C語言產生一定范圍的隨機數的源代碼如下:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i;
for(i=0; i<10; i++) //隨機產生10個數。
{
printf("%d ", rand());
}
return 0;
}
(2)正負隨機數公式c語言擴展閱讀
1、如果要隨機生成一個在一定范圍的數,你可以在宏定義中定義一個random(int number)函數,然後在main()裡面直接調用random()函數。
2、在對rand()的前三次調用中,並且此後得到的返回值仍然是在對rand()的第一批調用中所得到的其餘的返回值。因此,只有再次給srand()提供一個隨機的「種子」值,才能再次得到一個隨機數。
③ C語言中獲得隨機數的方法
問題1: 怎樣獲得一個真正的隨機數?要知道,rand()是不能產生真正的隨機數的!即使不能產生真正的隨機數,也要大概接近呀!而rand()好象每次的隨機都一樣。
專家解答:
之所以rand()每次的隨機數都一樣是因為rand()函數使用不正確。各種編程語言返回的隨機數(確切地說是偽隨機數)實際上都是根據遞推公式計算的一組數值,當序列足夠長,這組數值近似滿足均勻分布。如果計算偽隨機序列的初始數值(稱為種子)相同,則計算出來的偽隨機序列就是完全相同的。這個特性被有的軟體利用於加密和解密。加密時,可以用某個種子數生成一個偽隨機序列並對數據進行處理;解密時,再利用種子數生成一個偽隨機序列並對加密數據進行還原。這樣,對於不知道種子數的人要想解密就需要多費些事了。當然,這種完全相同的序列對於你來說是非常糟糕的。要解決這個問題,需要在每次產生隨機序列前,先指定不同的種子,這樣計算出來的隨機序列就不會完全相同了。你可以在調用rand()函數之前調用srand( (unsigned)time( NULL ) ),這樣以time函數值(即當前時間)作為種子數,因為兩次調用rand函數的時間通常是不同的,這樣就可以保證隨機性了。你也可以使用srand函數來人為指定種子數。Windows 9x/NT的游戲FreeCell就允許用戶指定種子數,這樣用戶如果一次游戲沒有成功,下次還可以以同樣的發牌結果再玩一次。
問題2: 我按照上述方法並不能產生隨機數,僅產生公差為3或4的等差數列:
#include <stdlib.h>
#include <iostream.h>
#include <conio.h>
#include <time.h>
void main()
{
for(int i=0;i<100000;i++)
{
srand( (unsigned)time( NULL ) );
cout<<rand()<<endl;
}
}
專家解答:
你的程序是有問題的,你每產生一個隨機數之前,都調用一次srand,而由於計算機運行很快,所以你每次用time得到的時間都是一樣的(time的時間精度較低,只有55ms)。這樣相當於使用同一個種子產生隨機序列,所以產生的隨機數總是相同的。你應該把srand放在循環外:
srand( (unsigned)time( NULL ) );
for(int i=0;i<100000;i++)
{
//相關語句
}
④ C語言隨機數如何生成既有正數又有負數的隨機數
C語言生成的隨機數為無符號數,即都是正的。要想生成正負隨機的,可以先通過模除限定返回,再減去對應的范圍的中間值即可。
比如,要獲取-1000~+1000范圍的隨機數,總的數量為2001個,這樣就可以通過代碼
rand()%2001 使得到的結果限制在0-2000范圍,再減去1000, 結果就是-1000~+1000之間了。
寫成代碼就是
rand()%2001 - 1000;
⑤ C語言 。 隨機產生一個正負數。
c語言的隨機數發生器是rand函數,
比如要產生一個[-100,100]的數字:
rand()%201-100即可
首先需要初始化隨機數發生器 (stdlib.h time.h)
srand((unsigned)time(NULL));
⑥ C語言中取隨機數的函數
1. 基本函數
在C語言中取隨機數所需要的函數是:
int rand(void); void srand (unsigned int n);
rand()函數和srand()函數被聲明在頭文件stdlib.h中,所以要使用這兩個函數必須包含該頭文件:
#include <stdlib.h>
2. 使用方法
rand()函數返回0到RAND_MAX之間的偽隨機數(pseudorandom)。RAND_MAX常量被定義在stdlib.h頭文件中。其值等於32767,或者更大。
srand()函數使用自變數n作為種子,用來初始化隨機數產生器。只要把相同的種子傳入srand(),然後調用rand()時,就會產生相同的隨機數序列。因此,我們可以把時間作為srand()函數的種子,就可以避免重復的發生。如果,調用rand()之前沒有先調用srand(),就和事先調用srand(1)所產生的結果一樣。
舉個例子,假設我們要取得0~10之間的隨機整數(不含10本身):
/* 例1:不指定種子的值 */
for (int i=0; i<10; i++) { printf("%d ", rand()%10); }
每次運行都將輸出:1 7 4 0 9 4 8 8 2 4
/* 例2:指定種子的值為1 */
srand(1); for (int i=0; i<10; i++) { printf("%d ", rand()%10); }
每次運行都將輸出:1 7 4 0 9 4 8 8 2 4
例2的輸出結果與例1是完全一樣的。
/* 例3:指定種子的值為8 */ srand(8); for (int i=0; i<10; i++) { printf("%d ", rand()%10); }
每次運行都將輸出:4 0 1 3 5 3 7 7 1 5
該程序取得的隨機值也是在[0,10)之間,與srand(1)所取得的值不同,但是每次運行程序的結果都相同。
/* 例4:指定種子值為現在的時間 */ srand((unsigned)time(NULL)); for (int i=0; i<10; i++) { printf("%d ", rand()%10); }
該程序每次運行結果都不一樣,因為每次啟動程序的時間都不同。另外需要注意的是,使用time()函數前必須包含頭文件time.h。
3. 注意事項
求一定范圍內的隨機數。
如要取[0,10)之間的隨機整數,需將rand()的返回值與10求模。
randnumber = rand() % 10;
那麼,如果取的值不是從0開始呢?你只需要記住一個通用的公式。
要取[a,b)之間的隨機整數(包括a,但不包括b),使用:
(rand() % (b - a)) + a
偽隨機浮點數。
要取得0~1之間的浮點數,可以用:
rand() / (double)(RAND_MAX)
如果想取更大范圍的隨機浮點數,比如0~100,可以採用如下方法:
rand() /((double)(RAND_MAX)/100) 其他情況,以此類推,這里不作詳細說明。
⑦ 關於C語言中的隨機函數rand()的源代碼~~到底怎麼求出隨機數的!!
return一句的功能只是把得數的絕對值控制在0~32767之間,關鍵是next
=
next
*
1103515245
+
12345一句。next變數是靜態的,變化以後的值是不消失的,下一次還可用,所以每執行一次next
=
next
*
1103515245
+
12345就獲得一個新值,這個新值被return取整除、取余除後控制在0~32767之間就形成了0~32767的隨機數。比如第一次,next=1*1103515245
+
12345=1103527590,經return中的對65536取整、對32768取余後就是16838;若再來一次,next已經是1103527590了,那麼next
=
next
*
1103515245
+
12345就為next
=
1103527590
*
1103515245
+
12345=1217759518843121895;但這個數已經溢出了,實際上表示成了-1770082073,經return中取整取余後返回的就是-27009;可以算出來,再下一次是10113……不過,你這個函數並不能產生真正意義上的「隨機」數,因為作為基數的1103515245在每次開始時是不變的,所以只能得出同樣的序列,即每次執行都產生16838、-27009、10113……這樣一組無限多的數。所以實際的C隨機函數rand()的形參並不是void而是一個長整型變數,通常來調用實時時間函數獲取實時時間值來得到,因為時間是每時每刻都在變化的,所以充當"1103515245」角色的數就每調用一次的值都不同。這樣每次執行就都能得到不重復的序列。至於12345,我想隨便取個數都行!僅供參考……
⑧ 怎麼使用c語言的隨機函數randomize()
randomize()不是隨機數生成函數,而是初始化隨機數生成器的函數,而且,它不是一個C語言標准庫函數,只能在win32環境中使用。生成隨機數要用rand()函數:
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
int i;
srand(time(NULL));
for (i=0;i<7;++i) printf("%d\t",rand()%10);
return 0;
}
⑨ C語言中產生隨機數的函數是什麼
rand函數也是調用dos的時鍾,進行的偽隨機函數.
你也可以使用時鍾來模擬隨機函數.
可以試用gettime這個函數:
long int MyRand(int x)
{
struct time t1,t2,t3;
gettime(&t1);
int y1=t1.ti_hund;//取1/100s作為基數
gettime(&t2);
int y2=t2.ti_hund;//取1/100s作為基數
gettime(&t3);
int y3=t3.ti_hund;//取1/100s作為基數
return y1*y2*y3;//產生的隨機數0~99*99*99
}
⑩ c語言隨機數函數是什麼
C語言隨機函數主要用於實現一組隨機數的生成。
代碼示例如下:
#include<stdio.h>
#include<stdlib.h>
int main ()
{
int a;
a=rand()%4;
printf("%d ",a);
return 0;
}
C預先生成一組隨機數,每次調用隨機函數時從指針所指向的位置開始取值,因此使用rand()重復運行程序產生的隨機數都是相同的,可以通過srand()函數來改變指針位置。
(10)正負隨機數公式c語言擴展閱讀:
C語言隨機函數指針位置
void srand( unsigned int seed )
改變隨機數表的指針位置(用seed變數控制)。一般配合time(NULL)使用,因為時間每時每刻都在改變,產生的seed值都不同。
基於毫秒級隨機數產生方法:
#include<windows.h>
種子設為:srand(unsigned int seed);
srand(GetTickCount());
參考資料:網路-C語言隨機函數