2017-08-19 78 views
-2

所以我試圖寫一個探路者,並有一些問題。Rand()和srand()的問題

我目前有一個開關()有四種情況,並希望隨機選擇其中之一。

do 
    { 
     if (checkLeft()==false && checkRight()==false && checkUp()==false && checkDown()==false) 
     { 
      cont = false; 
     } 

     int x = rand() % 4; 
     srand(static_cast<unsigned int>(time(NULL))); 
     if (cont == true) 
     { 
      switch(x) 
      { 
       case 0: 
        checkRight(); 
        break; 

       case 1: 
        checkDown(); 
        break; 

       case 2: 
        checkUp(); 
        break; 

       case 3: 
        checkLeft(); 
        break; 
      } 

     } 

    } while (currentx != max && currenty != max && cont == true); 

因爲它是'做'循環,它似乎並不真的是隨機的?我得到一致的結果。我如何確保從交換機()獲得完全隨機的輸出?

謝謝!

+0

在main的開頭只使用srand一次。 – theVoid

回答

0

你正在調用rand()之後的srand(),它已經使用了一個種子。 嘗試在rand()之前調用srand(),它只需要調用一次。所以,在做之前先調用它。 此外,您可能想看看(Random C++ Header Reference

0

嘗試調用srand()函數,而

1

time(NULL)有任何分辨率高於第二好不需要做之前。除非您的程序運行了很長時間,否則多次調用它可能會多次重複爲完全相同的值。這將解釋你的「一貫相似」的結果。 「按原樣」多次運行代碼,幾秒鐘或幾分鐘,可能會產生不同的結果。但是,如果它連續多次運行,它可能會重複地提供相同的值,並且緩慢地改變值。

一般來說,在第一次調用rand()之前,您只需在您的程序中撥打srand()一次。

如果您使用的是C++ 11或更高版本,則可以使用更高質量的生成器。閱讀文檔。