2017-02-17 12 views
0

私はStroustrupの著書「Programming:Principles and Practice with C++」 を勉強しながらヘッダファイルstd_lib_facilities.hを使用しています。第5章のエクササイズ13では、私の "Cow and Bulls"ゲーム(前回の演習)をもう少し面白くするためのrandint()関数に精通していましたが、この関数を使うと、回私のループを繰り返します。 std_lib_facilities.hからC++ランダントを使用して4桁の数字を生成

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より4桁の数字、さらに94410の5桁の数字を返します。なぜそれが起こっていますか?それはライブラリ内の関数からのエラーですか、それとも私自身のコードでは愚かな間違いですか?ありがとう。

(私は種を使ってより現実的なランダムを得ることができると知っていますが、それは私の質問とは関係ありません(少なくとも私の推測です!

+2

この本の後のバージョンに更新することをお勧めします。 StroustrupのコードはC++に ''ヘッダが追加される前の2010年のもので、 ''は乱数を生成するためのベースラインAPIでなければなりません。 – Xirema

+2

数字の間にスペースを入れて、数字の数と値を確認してください。それらのうちの1つが10であるように見えますが、なぜそれが起こるのかわかりません。 – interjay

+1

randintが0-N-1ではなく0-Nで数値を返すことは明らかです。すべての5桁の数字の例には10が含まれています。 –

答えて

1

リピートなしで4桁を生成するには、10 0 -9の配列をランダムにシャッフルし、最初の4つを取ります。

乱数シャッフルをするには、ランダムインデックスを0からN-1にスワップします(つまり、それ自体はノーオペレーションでスワップすることもあります)。1をN-1に、2をN-1に、等々。先頭の0が許可されていない場合は、最初の桁が特殊です。

関連する問題