2012-12-15 74 views
21

在这种相当基本的C++代码,涉及随机数生成段时间返回同一个号码:RAND()每次程序运行

include <iostream> 
using namespace std; 

int main() { 
    cout << (rand() % 100); 
    return 0; 
} 

为什么我总是得到的41的输出?我试图让它输出一个0到100之间的随机数。也许我不理解rand函数的工作原理。

+45

随机函数是不是41随机还不够吗?我不会想到它肯定... –

+4

你忘了初始化'srand'(http://en.cppreference.com/w/cpp/numeric/random/rand) – Borgleader

+0

不应该是一个不同的每次我运行它的数量? – codedude

回答

32

您需要更改seed

int main() { 

    srand(time(NULL)); 
    cout << (rand() % 101); 
    return 0; 
} 

srand播种件事是真的也为c语言代码。


参见: http://xkcd.com/221/

5

您还没有播种的数量。

使用:

#include <iostream> 
#include <ctime> 

using namespace std; 

int main() 
{ 
    srand(static_cast<unsigned int>(time(0))); 
    cout << (rand() % 100) << endl; 
    return 0; 
} 

你只需要种子它虽然一次。基本上不要每一个随机数字。

5

srand()种子随机数发生器。如果没有种子,生成器无法生成您正在查找的数字。只要对随机数的需求不是安全关键(例如任何类型的密码术),通常的做法是使用<ctime>库中的time()函数将系统时间用作种子,如srand(time(0))。这将使随机数生成器的系统时间表示为Unix时间戳(即自1970年1月1日以来的秒数)。然后您可以使用rand()来生成一个伪随机数。

这里是从duplicate question报价:

的原因是,从rand()函数产生的随机数不是 随机实际。它只是一个转变。维基百科给出了更好的 解释伪随机数发生器的含义:确定性的 随机位发生器。每次调用rand()时,都需要生成种子和/或最后一个随机数(C标准没有指定使用的算法 ,尽管C++ 11有指定一些常用算法的功能),但是,运行 对这些数字进行数学运算,并返回结果。因此,如果 种子状态每次都是相同的(就像你不用真正的 随机数调用srand一样),那么你总是会得到相同的“随机”数字。

如果您想了解更多,您可以阅读以下内容:

http://www.dreamincode.net/forums/topic/24225-random-number-generation-102/

http://www.dreamincode.net/forums/topic/29294-making-pseudo-random-number-generators-more-random/

9

对于什么它值得你也是0到99之间只产生数(含) 。如果你想生成0到100之间的值,你需要。

rand() % 101 

除了像其他人提到的那样调用srand()。

+0

好点。这是值得的upvote :) – codedude

+0

此外,数字将不会均匀分布,因为它不太可能兰德返回数量均匀分布在101的确切倍数。 – jcoder

3

像Borland的编译

using namespace std; 

int sys_random(int min, int max) { 
    return (rand() % (max - min+1) + min); 
} 

void sys_randomize() { 
    srand(time(0)); 
}