下面的函數運行,但每次運行程序時總是返回相同的數字。有沒有一種方法可以生成每次運行程序時都不相同的隨機數字?2個數字之間的C++隨機數重置
int getrand(int min,int max){
int rnum = rand()%(max-min)+min;
return rnum;
}
下面的函數運行,但每次運行程序時總是返回相同的數字。有沒有一種方法可以生成每次運行程序時都不相同的隨機數字?2個數字之間的C++隨機數重置
int getrand(int min,int max){
int rnum = rand()%(max-min)+min;
return rnum;
}
一個簡單的解決方案,以隨機曾經將是:
int getrand(int min, int max) {
static bool init = false;
if (!init) {
srand(time(NULL));
init = true;
}
return rand()%(max-min)+min;
}
在C++中使用int作爲布爾值,真的嗎?此外,這可能會重新初始化其他序列的全局隨機生成器,但不會發生這種情況。 – KillianDS
這樣做,非常感謝所有人。 – user1054513
將它改爲bool(在我的μC世界中) – tripplet
好像你忘了打電話srand
。
嘗試這樣的:
/* initialize random seed: */
srand (time(NULL));
某處時,你的程序啓動(絕對不是在你的getrand()函數)。這將迫使發電機每次啓動不同的種子。
你可能會喜歡使用高品質的標準庫隨機數生成設施:
#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;
}
嘗試你的例子它不喜歡get_seed() – user1054513
@ user1054513:這只是一個例子。你必須提供你自己的種子價值。如果你想不出任何東西,請使用'4'。 –
@ user1054513這是因爲它是爲生成器提供種子的函數的通用佔位符。很多時候,一些時間功能用於此目的,因爲每次運行時可能會有所不同。 – KillianDS
僞隨機數生成器需要進行「播種」你使用它們之前;默認種子每次都是相同的,所以你得到相同的序列。
通常情況下,您會使用類似srand(time(NULL))
的東西,但如果您在一秒之內再次運行該程序,則會失敗。
因爲前幾個值與種子本身高度相關,所以在種子播種後使用一兩個隨機數也很好。
您需要啓動種子。檢查出srand
。另外,嘗試,如果你想提高:
boost::lagged_fibonacci607 base_prng(seed);
boost::variate_generator<boost::lagged_fibonacci607&,boost::uniform_smallint<> > prng(base_prng,boost::uniform_smallint<>(min,max))
你一定要明白,你的代碼是有問題的2個原因?首先,'max'和'min'與某些庫/ API中的#defines和函數衝突,其次,'%'會導致非均勻分佈,除非模數(偶然)是2的冪。「正確」在某些範圍內生成隨機數的方法是生成隨機數並拒絕超出範圍的數。關於實際的問題,你想在程序啓動時執行一次。 – Damon
任何地方都不能有名爲'max'和'min'的宏,因爲這些是標準庫中函數的名稱;如果存在這樣的宏,則不能使用標準庫。 –
@Damon雖然這是嘗試,你必須拒絕一些數字,以避免偏見,你不能只是拒絕那些超出範圍;如果範圍是[0,1],那麼你將不得不拒絕大量的數字。 –