用c++寫了個蟻群算法,發現用到c++隨機數這里還是問題多多,下面就來總結一下:
首先調用rand()函數可以生成一個0-RAND_MAX之間的隨機數,RAND_MAX的值為32767;
然后假設我輸出一個rand()之后,重新編譯運行代碼,這個值不會變,
想要得到一個新的隨機數,這里就要用到隨機數種子初始化函數srand()
一般都是選擇系統時間作為種子
即srand((unsigned int)time(NULL))
下面上個簡單的代碼
#include<stdio.h> #include<stdlib.h> #include<time.h> #include<conio.h> #include<iostream> #define N 10 #define M 1010 using namespace std; int main() { double num,i; srand((unsigned int)time(NULL));//產生隨機數的種子 cout<<RAND_MAX<<endl; for(i=1;i<=N;i++) { num= (double)(rand()%10000)/10000;//產生隨機數 cout<<num<<endl; } }
注意千萬不能把srand函數放到循環體里面,如下:
for(i=1;i<=N;i++) { srand((unsigned int)time(NULL));//產生隨機數的種子 num= (double)(rand()%10000)/10000;//產生隨機數 cout<<num<<endl; }
這樣會輸出N個相同的值(當N不是很大的時候),因為做N次循環的時間太短了,所以相當於給這N個數都初始化了相同的種子
最后就是如何生成大於RAND_MAX的隨機數的問題
似乎不能直接修改宏定義,所以目前還沒有想到解決的方法