- ベストアンサー
C言語での乱数の生成方法
C++のプログラミングで質問があります。 1~8の数字の中で"違う"数字を4つ発生させたいのですが、どのように組めばいいのか分かりません。 回答をお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
1)配列に 1 から 8 の数字を入れる。 2)それをランダムにシャッフルする。 3)先頭の 4つ を取り出す。
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
重複なく乱数を生成するのは for (i = 0; i < n; ++i) { data[i] = i; } for (i = n; i > 0; --i) { int p = (0以上 i未満の乱数); int t = data[p]; data[p] = data[i]: data[i] = data[p]; } とするのがよくあるパターン.
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
違う数字ということにこだわらなければ、1~8の乱数は発生できるのでしょうか? それでしたら、 bool hit[8]; のような配列を準備して、 for(i = 0; i < 8; i++) hit[i] = false; で、全部の数字を出てないことにして、 for(int i = 0; i < 4;) { int n = (1~8の乱数を一個発生); if (hit[n - 1]) { // この数字は既に出てしまっている contineu; // だから、次の数字を探す } else { // この数字はまだ出ていない hit[n - 1] = true; // この数字が出てきたと印をつける n を使う } } こんな感じで。 あと、ちょっと大鉈な気もしますが、STL を使うと、 #include <algorithm> int a[] = {1, 2, 3, 4, 5, 6, 7, 8}; std::random_shuffle(&a[0], &a[8]); で、a[] の中身がランダムに入れ替わるので、先頭の4個を使えばいいかと。 ただ、この場合、実行する度に同じ結果になりますが。
- SAYKA
- ベストアンサー率34% (944/2776)