2011-12-09 43 views
0

下面的函數運行,但每次運行程序時總是返回相同的數字。有沒有一種方法可以生成每次運行程序時都不相同的隨機數字?2個數字之間的C++隨機數重置

int getrand(int min,int max){ 
int rnum = rand()%(max-min)+min; 
return rnum; 
} 
+2

你一定要明白,你的代碼是有問題的2個原因?首先,'max'和'min'與某些庫/ API中的#defines和函數衝突,其次,'%'會導致非均勻分佈,除非模數(偶然)是2的冪。「正確」在某些範圍內生成隨機數的方法是生成隨機數並拒絕超出範圍的數。關於實際的問題,你想在程序啓動時執行一次。 – Damon

+1

任何地方都不能有名爲'max'和'min'的宏,因爲這些是標準庫中函數的名稱;如果存在這樣的宏,則不能使用標準庫。 –

+2

@Damon雖然這是嘗試,你必須拒絕一些數字,以避免偏見,你不能只是拒絕那些超出範圍;如果範圍是[0,1],那麼你將不得不拒絕大量的數字。 –

回答

0

一個簡單的解決方案,以隨機曾經將是:

int getrand(int min, int max) { 
    static bool init = false; 

    if (!init) { 
    srand(time(NULL)); 
    init = true; 
    } 

    return rand()%(max-min)+min; 
} 
+0

在C++中使用int作爲布爾值,真的嗎?此外,這可能會重新初始化其他序列的全局隨機生成器,但不會發生這種情況。 – KillianDS

+0

這樣做,非常感謝所有人。 – user1054513

+0

將它改爲bool(在我的μC世界中) – tripplet

1

好像你忘了打電話srand

2

嘗試這樣的:

/* initialize random seed: */ 
    srand (time(NULL)); 

某處時,你的程序啓動(絕對不是在你的getrand()函數)。這將迫使發電機每次啓動不同的種子。

6

你可能會喜歡使用高品質的標準庫隨機數生成設施:

#include <random> 

typedef std::mt19937 rng_type; 
std::uniform_int_distribution<rng_type::result_type> udist(min, max); 

rng_type rng; 

int main() 
{ 
    // seed rng first: 
    rng_type::result_type const seedval = 4; // or implement a good get_seed()? 
    rng.seed(seedval); 

    rng_type::result_type random_number = udist(rng); 

    return random_number; 
} 
+0

嘗試你的例子它不喜歡get_seed() – user1054513

+0

@ user1054513:這只是一個例子。你必須提供你自己的種子價值。如果你想不出任何東西,請使用'4'。 –

+0

@ user1054513這是因爲它是爲生成器提供種子的函數的通用佔位符。很多時候,一些時間功能用於此目的,因爲每次運行時可能會有所不同。 – KillianDS

1

僞隨機數生成器需要進行「播種」你使用它們之前;默認種子每次都是相同的,所以你得到相同的序列。

通常情況下,您會使用類似srand(time(NULL))的東西,但如果您在一秒之內再次運行該程序,則會失敗。

因爲前幾個值與種子本身高度相關,所以在種子播種後使用一兩個隨機數也很好。

0

您需要啓動種子。檢查出srand。另外,嘗試,如果你想提高:

boost::lagged_fibonacci607 base_prng(seed); 
boost::variate_generator<boost::lagged_fibonacci607&,boost::uniform_smallint<> > prng(base_prng,boost::uniform_smallint<>(min,max))