常に変化する擬似乱数整数を作成するにはどうすればよいですか? このようにして、次のように入力できます。
cout << randomInt << endl;
cout << randomInt << endl;
cout << randomInt << endl;
プログラムは次のようなものを返します。
45.7
564.89
1.64
(これが意味をなすかどうかはわかりません。)
乱数を表すクラスを作成します。
class Random {
};
次にオーバーロードoperator<<
:
std::ostream& operator<<(std::ostream& os, const Random& random) {
return os << generate_random();
}
使用:
int main() {
Random random;
std::cout << random;
std::cout << random;
std::cout << random;
return 0;
}
明らかに、を実装する必要がありますgenerate_random
。
新しいC++11 疑似乱数生成クラスの使用:
#include <random>
#include <iostream>
int main()
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(1, 6);
for(int n=0; n<10; ++n)
std::cout << dis(gen) << ' ';
std::cout << '\n';
}
上記は、サイコロを 10 回振ることをシミュレートしています。
整数の代わりに浮動小数点値が必要な場合は、std::uniform_real_distribution
代わりに を使用しstd::uniform_int_distribution
ます。
これはまさにstd::rand
次の目的です。
#include <cstdlib>
#include <ctime>
#include <iostream>
int main()
{
std::srand(static_cast<unsigned>(std::time(0))); // seed
for (int i = 5; i--;) std::cout << std::rand() % 5 << '\n';
// Output are random integers
}
単一の暗黙的な変換でクラスを作成する
class t { operator int() { return 42; } };
int main()
{
t test; std::cout << t <<'\n';
return test;
}
もちろん、あなたが望む他のメンバーは何でも、他の変換演算子はありません。
これは他のランダムコードではうまく機能しません...
#include <ctime>
#include <cstdlib>
struct RandomInt {
RandomInt() {
static bool initialized = (srand(std::time(0)), true);
}
operator int() {
return std::rand();
}
};
#include <iostream>
std::ostream& operator<<( std::ostream& stream, RandomInt x ) {
return stream << static_cast<int>(x);
}
int main() {
RandomInt randomInt;
std::cout << randomInt << "\n";
std::cout << randomInt << "\n";
std::cout << randomInt << "\n";
}
これはかなり悪い考えです。