2012-09-25 65 views
0

此代碼應該生成1到10之間的隨機數,但每次都返回1。使用C++的1到10之間的隨機數

int random_integer; 
int lowest=1, highest=10; 
int range=(highest-lowest)+1; 
random_integer = lowest + int(range*rand()/(RAND_MAX + 1.0)); 
cout << random_integer << endl; 

代碼有什麼問題?

+1

種子你的隨機生成器:srand((unsigned)time(0)); – Ram

+3

C++ 11內置了更好的[PRNG功能](http://en.cppreference.com/w/cpp/numeric/random),包括[classes](http://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution)來創建範圍內的數字。請參閱最後一個鏈接中的示例。 –

回答

4
range * rand()/(RAND_MAX + 1.0) 

不符合您的想法。介紹一些括號:

range * (rand()/(RAND_MAX + 1.0)) 

(請注意,此方法對skewed distributions,雖然)。

+0

什麼是在1-10之間獲得未糾正分佈的最簡單方法。 – rajat

+0

@rajat:http://eternallyconfuzzled.com/arts/jsw_art_rand.aspx(或使用[C++ 11](http://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution)或[ Boost](http://www.boost.org/doc/libs/1_51_0/doc/html/boost/random/uniform_int_distribution.html)庫) –

2

如果你想lowesthighest之間的隨機整數,你最好是寫

random_integer = lowest + rand() % range 
4

您必須遵守這裏溢出 - range*rand()

只需使用普通人使用的東西:rand() % 10 + 1

0

您似乎認爲rand()返回0和1

之間的值,這是不正確的,它返回值在0和RAND_MAX之間。

2

我同意上面提供的所有解決方案。
現在得到一個不同的順序,每次你運行你的程序,你可以使用srand()函數功能將提供種子蘭特()功能如下: -

srand(time(NULL)) 
random_integer = lowest + rand() % range 
0

這兩個是永遠我的程序的一部分

float randf(float lo, float hi) { 
    float random = ((float) rand())/(float) RAND_MAX; 
    float diff = hi - lo; 
    float r = random * diff; 
    return lo + r; 
} 
int randi(int lo, int hi) 
{ 
    int n = hi - lo + 1; 
    int i = rand() % n; 
    if (i < 0) i = -i; 
    return lo + i; 
}