2017-02-17 325 views
0

我在研究Stroustrup的书“Programming:Principles and Practice using C++” 时使用头文件std_lib_facilities.h,我在前几章中。在第5章的练习13中,我熟悉了使用我的“奶牛和公牛”游戏(前一练习)的randint()函数更有趣一些,但是当我使用这个函数时,它有时会产生比次迭代我的循环。使用C++生成四位数randint

std_lib_facilities.h

inline int randint(int max) { return rand()%max; } 

这里是我的代码:

vector<int> answer; 
for (int i = 0; i<4; ++i) { 
    int answer_digit=randint(10); 
    answer.push_back(answer_digit); 
} 
for (int i = 0; i < 4; ++i) std::cout << answer[i]; 
_getch(); 
std::cout << std::endl; 

例如在我的情况下,它提供了63109的第一个数字,然后4706,然后5423,然后7个四位数字,然后又是五位数字,即94410.为什么会发生这种情况?这是库中函数的错误,还是我自己代码中的一个愚蠢的错误?谢谢。 (我知道我可以通过使用种子获得更现实的随机,但这与我的问题无关(至少,我的猜测!))。

+2

您可能需要更新本书的更高版本。 Stroustrup的代码是从2010年开始的,这是在''头文件被添加到C++之前的版本,''应该是用于生成随机数的基准API,以防止问题与您在这里面临的问题完全相同。 – Xirema

+2

尝试在数字之间打印一个空格,以查看有多少和有哪些值。它看起来像其中一个可能是10,但我不明白为什么会发生。 – interjay

+1

很显然,randint返回的是0-N而不是0-N-1的数字。所有五位数的例子包含10. –

回答

1

要生成4位数字而不重复,随机洗牌10 0 -9的数组并取前4位。

随机洗牌,将第一个随机索引换成0到N-1(所以可能与自己无操作交换)将第二个换成N-1,第二个换成N-1等等。如果前导0不允许,特殊情况下的第一个数字。