1

C++ の rand() と srand() の概念を理解するのに苦労しています。2 つの乱数を表示し、ユーザーに応答を入力させ、応答とメッセージを一致させ、これを 5 回行うプログラムを作成する必要があります。

私の質問は、それをどのように使用するかです。指示には、time()関数を使用できないと書かれており、rand()に関するオンラインのすべてのチュートリアルにあるようです。

これは私がこれまでに持っているものです。

#include <iostream>
#include <cmath>
#include <cstdlib>

using namespace std;

int main()
{

int seed;
int response;

srand(1969);
seed=(rand()%10+1);

cout<<seed<<" * "<<seed<<" = ";
cin>>response;
cout<<response;
    if(response==seed*seed)
    cout<<"Correct!. you have correctly answered 1 out of 1."<<endl;
    else 
    cout<<"Wrong!. You have correctly answered 0 out of 1."<<endl;

これは6 * 6または7 * 7のようなものを出力するだけです。シード変数は必ずしも異なるとは限りませんが、常に同じではないと思いましたか?

出力は次のようになります。

3 * 5 =
34
Wrongo. You have correctly answered 0 out of 1.
8 * 1 =
23
Wrongo. You have correctly answered 0 out of 2.
7 * 1 =
7
Correct! You have correctly answered 1 out of 3.
2 * 0 =
2
Wrongo. You have correctly answered 1 out of 4.
8 * 1 =
8
Correct! You have correctly answered 2 out of 5.

Final Results: You have correctly answered 2 out of 5 for a 40% average.

要件は次のとおりです。

プログラムでは、必要に応じて rand() を使用して疑似乱数を生成する必要があります。srand() を使用して乱数ジェネレーターを初期化できますが、プラットフォームに依存する可能性が高いため、「自動」イニシャライザー (time() 関数など) は使用しないでください。プログラムでループを使用しないでください。

4

4 に答える 4

2

ところで、これは C++ であるためstd::uniform_int_distribution、実際に を使用する必要があります。

#include <functional>
#include <random>
...
auto rand = std::bind(std::uniform_int_distribution<unsigned>(0, 10),
    std::default_random_engine());

rand()これで、 を使用して、目的の間隔で数値を生成できます。

于 2012-09-10T00:07:00.450 に答える
1

今の使い方で大丈夫そうです。すべてのチュートリアルで使用する理由は、プログラムを実行time()するたびに数値が異なるためです。したがって、固定数を使用すると、プログラムが実行されるたびに、出力 (数値生成) は同じになります。ただし、要件によると、これは問題ではないようです (プログラムを実行するたびにランダム生成を変える必要がある場合は、質問で指定してください)。

ただし、rand()%10+1範囲内1 to 10とは限りませんので0 to 10ご了承ください。

編集後

必要な出力を得るには、次のように 2 つのシードを作成するだけです。

seed1=(rand()%11);
seed2=(rand()%11);
cout<<seed1<<" * "<<seed2<<" = ";

また、ユーザーに を要求し、seedそれを に渡して、srand各実行をよりランダムにすることもできます。

要件について:

「自動」初期化子 (time() 関数など) は使用しないでください。これらはプラットフォームに依存する可能性が高いためです。

std::time<ctime>ヘッダーの標準 C++ 関数です。結果がプラットフォームに依存する場合、それが重要な理由がわかりません。

プログラムでループを使用しないでください。

これも非常に奇妙な要件です。ループは、あらゆるプログラムの基本的な構成要素です。要件は私には非常に奇妙に思えます。教授または教師に説明を求めます。

于 2012-09-09T23:37:57.197 に答える
0

srand()ランダム関数をシードするために使用します。これは必要です。そうしないと、各実行で同じ一連の番号が取得され、各呼び出しがrand()

好きなものをランドにシードできます。通常、返される数値はプログラムの実行ごとに異なるため、ほとんどのチュートリアルでは現在の時間をシードとして使用しています。

本当に機能を使用できない場合はtime()、シードをコマンド ライン引数として渡します。

int main(int argc, char* argv[])
{
    srand(atoi(argv[1])); // Seed with command line argument.
}
于 2012-09-09T23:24:34.587 に答える
0

Windowsでは、time() の代わりにGetTickCount()を使用できます。シードする必要のないrand_s
を 使用できます。 *nix システムでは、/dev/random を利用できます。

( /dev/random の使い方)

于 2012-09-09T23:39:22.003 に答える