重複無し乱数
Posted feedbacks - C++
std::random_shuffle を使います。乱数生成関数オブジェクトを指定しないと、何度実行しても同じ乱数列を発生させてしまうので、srand()を使う関数オブジェクトを定義します。
普通はtime()で得られる値を種にするらしいのですが、これは秒単位なので、同一秒内で再度実行すると、やはり同じ乱数列が得られてしまい、うまくありません。
そこで、Windowsでは、起動からのミリ秒を種として渡すことにしました。
普通はtime()で得られる値を種にするらしいのですが、これは秒単位なので、同一秒内で再度実行すると、やはり同じ乱数列が得られてしまい、うまくありません。
そこで、Windowsでは、起動からのミリ秒を種として渡すことにしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | #include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <cstdlib>
#ifdef _WIN32
# include <windows.h>
# define seed() ::GetCurrentTime()
#else
# include <ctime>
# define seed() std::time(NULL)
#endif
struct RandomGenerator
{
RandomGenerator()
{
std::srand(static_cast<unsigned>(seed()));
}
int operator()(int n) const
{
return std::rand() % n;
}
};
void bingo(size_t n)
{
std::vector<size_t> v;
for (size_t i = 0; i < n; ++i)
{
v.push_back(i);
}
static RandomGenerator gen;
std::random_shuffle(v.begin(), v.end(), gen);
std::copy(v.begin(), v.end(), std::ostream_iterator<size_t>(std::cout, " "));
std::cout << std::endl;
}
int main()
{
bingo(10);
bingo(3);
bingo(3);
bingo(3);
bingo(10);
}
|

raynstard
#3402()
Rating0/0=0.00
このお題はraynstardさんの投稿を元にしています。ご投稿ありがとうございました。 投稿の内容には表示のしかたも含まれていたのですが、 このお題では「重複しない1~nまでの乱数をどうやって作るか」という点に集中することにして、 結果の整形は続編としてこの後のお題で出すことにします。 サンプル入出力は下のようになります。
[ reply ]