2

これはいくつかの C++ コードの抜粋です。これについては、後日詳しく説明する必要があります。

std::vector<int> vct(8, 5);

std::generate(vct.begin(), vct.end(), &rand);

std::copy(vct.rbegin(), vct.rend(),
    std::ostream_iterator<int>(std::cout, "\n"));

小さな神秘的な &rand を除いて、私はそれについてすべてを理解していると思います。それは正確に何をしますか?つまり、ある種の疑似乱数を生成することは明らかですが、それらは常に同じままです。&rand はどこから来たのですか? どんな表現ですか?それが生み出す価値はどこから来るのか?私は少し混乱しています…</p>

また、コード内に「rand」という単語が他に出現することも、乱数と関係がある可能性のあるコードも見当たりませんでした。C++ での私の (非常に限られた) 経験から、事前に宣言またはインクルードしなくても単純に機能するものはごくわずかであることがわかったため、不思議に思いました。

助けてくれてありがとう!

4

5 に答える 5

13

&inは、関数の&randアドレスを返しますrand()。関数ポインターを渡しているgenerate()ので、generate()呼び出しrand()て乱数を生成できます。

于 2009-11-06T01:29:09.307 に答える
5

rand()は C 標準ライブラリの関数で、0 と define の間の疑似乱数を生成しますRAND_MAX。C++ を使用する場合は、ヘッダー<cstdlib>をインクルードして (の代わりに<stdlib.h>) srand()を使用すると、シードを設定できます。アプリケーションを実行するたびに新しいシードが必要な場合は、time() から値をシードできます。

2001 年のPOSIX 標準には、 rand()およびsrand()の実装例があります。マニュアルページからコピーして貼り付けました。C 標準ライブラリで使用される実装は、次のものとは異なる場合があります。

static unsigned long next = 1;

/* RAND_MAX assumed to be 32767 */
int myrand(void) {
    next = next * 1103515245 + 12345;
    return((unsigned)(next/65536) % 32768);
}

void mysrand(unsigned seed) {
    next = seed;
}

また、&は関数からアドレスを取得します。コンパイラは、この部分ではあいまいです。関数ポインターからアドレスが必要な場合、この演算子を使用する必要があるものもあります。他の人はしません。generate<algorithm>は、C++ 標準ライブラリのヘッダーの関数です。関数および/またはファンクター オブジェクトを受け取り、それを使用して、指定したコンテナーの whos イテレーターの値を生成します。

于 2009-11-06T01:36:17.213 に答える
2

randcstdlib で定義されています。同じ「シード」を使用しているため、同じ値を取得しています。それは設計によるものです。

別のシードが必要な場合は、srand最初に呼び出しますsrand(time(NULL));

于 2009-11-06T01:27:19.510 に答える
0

rand() は、標準 C ライブラリの一部である関数です。その署名は次のとおりです。

int rand(void);

stdlib.h で定義されています。ほとんどの場合、std C++ ライブラリの実装には、 または .

于 2009-11-06T01:30:13.577 に答える
0

&randは単に「のアドレス」を意味しますrandrand疑似乱数を返す標準ライブラリの関数です。あなたがしているのは、この関数のアドレスをアルゴリズムに渡すことです。次に、作業中にこの関数を呼び出します。

それ自体に関する限りrand、まともなC ++ドキュメントは、観察している方法で動作する理由を教えてくれます...(ここでの他の回答も同様です)

于 2009-11-06T01:30:52.437 に答える