C/C++產生隨機數


C語言/C++怎樣產生隨機數:這里要用到的是rand()函數, srand()函數,C語言/C++里沒有自帶的random(int number)函數。
(1)  如果你只要產生隨機數而不需要設定范圍的話,你只要用rand()就可以了:rand()會返回一隨機數值, 范圍在0至RAND_MAX 間。RAND_MAX定義在stdlib.h, 其值為2147483647。

rand()函數產生的是一個隨機整數。

 

1 = rand() % 100;         // v1 in the range 0 to 99
v2 = rand() % 100 + 1; // v2 in the range 1 to 100
v3 = rand() % 30 + 1985; // v3 in the range 1985-2014

 

例如:

#include<stdio.h>
#include
<stdlib.h>
void main()
{
for(int i=0;i<10;i+)
printf(
"%d\n",rand());
}

(2)  如果你要隨機生成一個在一定范圍的數,你可以在宏定義中定義一個random(int number)函數,然后在main()里面直接調用random()函數:

例如:隨機生成10個0~100的數:
#include
<stdio.h>
#include
<stdlib.h>
#define random(x) (rand()%x)

void main()
{
for(int x=0;x<10;x++)
printf(
"%d\n",random(100));
}

(3)但是上面兩個例子所生成的隨機數都只能是一次性的,如果你第二次運行的時候輸出結果仍和第一次一樣。這與srand()函數有關。srand()用來設置rand()產生隨機數時的隨機數種子。在調用rand()函數產生隨機數前,必須先利用srand()設好隨機數種子(seed), 如果未設隨機數種子, rand()在調用時會自動設隨機數種子為1。上面的兩個例子就是因為沒有設置隨機數種子,每次隨機數種子都自動設成相同值1 ,進而導致rand()所產生的隨機數值都一樣。

srand()函數定義 : void srand (unsigned int seed); 
通常可以利用geypid()或time(0)的返回值來當做seed
如果你用time(0)的話,要加入頭文件#include<time.h>

#include<stdio.h>
#include
<stdlib.h>
#include
<time.h>
#define random(x) (rand()%x)

void main()
{

srand(
time(0));//或srand(time(NULL)); NULL 0一樣
for(int x=0;x<10;x++)
printf(
"%d\n",random(100));
}

 要想取得[a,b)之間的隨機整數,使用(rand()%(b-a))+ a,結果包含 a 而不含 b 。

void srand(unsigned int seed)

If seed is set to 1, the generator is reinitialized to its initial value and produces the same values as before any call torand or srand.  srand函數介紹http://www.cplusplus.com/reference/clibrary/cstdlib/srand/

 

 srand(unsigned(time(NULL)))應該放哪里呢?

答案是:放在所有循環的外面,也即函數的開頭。

這是由於C++運行速度太快,基本上小型的循環瞬間就可以搞定,而Time(NULL)的刷新頻率是一秒,所以准確的答案應該是:放在運算速度在一秒以上的那層循環里。

下面的程序:

int main()
{
for(int i=0;i<5;i++)
{
srand((unsigned)time(NULL));
cout
<<rand()%5<<ends;
}
}

每次輸出的都是相同的數,為什么?

因為循環內運行時間太短了,導致每次循環的時間time 種子都幾乎一樣,所以rand()產生的值一樣。

遵循下面的原則:

 srand((unsigned)time(NULL)) 
放的地方離rand“遠一點”,即兩句執行的間隔大點,
比如不要把srand和rand同放在一個循環里,這樣時間上基本沒變,
所取的種子是相同的。
所以結果一樣

上面的應該改成:

int main()
{
srand((unsigned)time(NULL));

for(int i=0;i<5;i++)
{

cout
<<rand()%5<<ends;
}
}

上面的只是保證每次運行程序得到的隨機序列不一樣,每次產生的隨機序列都是根據第一個數推出來的,因為用的是線性同余法。

r(n+1)是根據r(n)推出來的。

下面的程序可以保證每次產生的隨機序列沒有規律;

#include<iostream>
#include
<ctime>
#include
<cmath>
#include<Windows.h>

using namespace std;

int main()
{


for(int i=0;i<5;i++)
{
srand((unsigned)time(NULL));
Sleep(
1000);
cout
<<rand()%5<<ends;
}
}

利用Sleep(1000)使每次循環時間都大於1秒,這樣每次的time seed種子就是不同的了。

參考:http://www.myexception.cn/cpp/280329.html

http://bbs.csdn.net/topics/310169092


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: