
課題を解いて欲しいです。。。
パーティでビンゴ大会を行おうとしている。
そのビンゴでは1~n の数字をコンピュータを用いてひとつずつ取り出すのだが、そのプロ
グラムがまだ完成していない。
1. n=200 としたとき、あなたが考えた実行方法をコーディングしなさい。
2. インターネットを用いて最適と思われる方法を探しだし、同様に n=200 としてコーデ
ィングしなさい。
3. 1 と2 の方法について実行時間を計測しなさい。
4. 1 と2 の方法をそれぞれ考察しなさい。
ただし、1、2、共にそれぞれどのような考え方で行ったか、説明を付随する。
全くわからないのでお願いします。
No.12ベストアンサー
- 回答日時:
> ANo.10
map使うまでもなし。setで充分。
#include <iostream>
#include <set>
#include <cstdlib>
int main() {
std::set<int> doneNumber;
const int numOfBingo = 200;
// インデックスとしては、1 - 200 じゃなくて、 0 - 199 を使う
while ( doneNumber.size() < numOfBingo ) {
int n = std::rand(); // ひとつ番号を出してみて
// その場号が範囲内かつまだでてなければ出力する
if ( n < numOfBingo && doneNumber.insert(n).second ) {
std::cout << (n + 1) << "\n";
}
}
}
# アルゴリズムは依然として最低ですが ^^;
No.16
- 回答日時:
計算量一緒なのに質問1の回答と断定されてもループが一個多くなるからたしかにオーバーヘッド増えるし負けましたすいません勘弁してくださいごめんなさいだからむきにならないでベタ張りしてるのが痛すぎて読む気になれなかったんですごめんなさい無職でもコード書く時間無かったんですすいませんでした0~i(n<100)とかするより1~200にすればiMAXとか余計な変数使わなくて良いからC言語なら7Byte余分にGEEEEEEEEET!とか言わないから許してくださいごめんなさい7Byteは与太じゃないからゆるしてくださいそもそも課題やってください系の質問に書いてる時点で釣りだろとか言いませんのでごめんなさいすいませんでしたゆるしてくださいいろんなところでこういう質問に自分で考えろとか説教たれてる無職が見てていたたまれなかったんですごめんなさいすいません自分も無職でした本当にすいませんでした許してください。
No.15
- 回答日時:
No.14 さんへ
質問者さんの質問に回答出来るのは、質問 2 のみだと私は思っています。
なので、私は No.7 No.11 で最適と思われる方法を回答させて頂きました。
他の言語にてソースを提示する事は、質問 2 に関して問題は無いはずです
No.14さんは、質問 1 の回答をされておられる様ですが、それこそ、
それは質問者さんが、自分で考えなければ意味が無い部分の回答だと思いますよ
No.14
- 回答日時:
学校の課題ならC以外の言語分かってるとは考えにくいだろうが。
なにベタ書きしてんの?
英語分からない子に英語でこういうんだよって言ってるのと同じだろうが、
手順書くべきだろ。
手っ取り早くCで実装できるのは
・長さ200の配列を用意する、各値はインデックスと同じでかまわない。
・0~199の乱数を複数回発生させる。
・乱数発生2回毎に1回目と2回目の値をインデックスとして配列の内容を入れ替える。
・頭から出力。

No.13
- 回答日時:
> A No. 12
おお、set::insert() に返り値があるなんて初めて気がつきました。
重複した要素の挿入は、失敗なんですね、扱いとして。なんとなく「無視されるだけ」というイメージでした。
No.11
- 回答日時:
No.7 です
No.7で書いた、最適と思われるコードを EXCEL のVBA で書いておきます。
Sub test()
Dim i As Integer
Dim iMax As Integer
Dim n(200) As Integer
Dim r As Integer
iMax = 199
'
'n[200]等の配列を用意し、n[0]~n[199]に 1~200 の数字を入れる
For i = 0 To iMax
n(i) = (1 + i)
Next i
'準備OK
For i = iMax To 0 Step -1
' 0 ~ i の範囲で乱数を発生させる
r = Int((i + 1) * Rnd())
' Sheet1.セルA 列 1行目からに n(r)の中身をセット
Worksheets("Sheet1").Cells(1 + (iMax - i), "A").Value = n(r)
' n(r) に n(i)の値をセット
n(r) = n(i)
Next i
End Sub
これだけです。

No.10
- 回答日時:
No.5 です。
C++で(というか、STLで)書いてみたもの。
でも、No.5 と見かけが全然変わらないのは、C++とSTLの素性の良さかな。
ロジックは、あいかわらず「ほぼ最低」ですが。
#include <cstdlib>
#include <iostream>
#include <map>
int main()
{
std::map<int, bool> doneNumber;
const int numOfBingo = 200;
int i;
// インデックスとしては、1 - 200 じゃなくて、 0 - 199 を使う
while(1)
{
int n = std::rand(); // ひとつ番号を出してみて
if (n < numOfBingo) // numOfBingo 未満ならいけそう
{
if (! doneNumber[n]) // その場号がまだでてなければ、
{
doneNumber[n] = true; // 番号がでたという印をつけて
std::cout << (n + 1) << "\n";
}
}
for(i = 0; i < numOfBingo; i++)
{
// 全部の数字が出たかどうか確認するためのループ
if (! doneNumber[i]) break; // まだ出てない数字があれば、ループを抜ける
}
if (i >= numOfBingo) // 全部カウントした == 出てない数字はない
break;
}
return 0;
}
No.9
- 回答日時:
> 課題の答えとして提出するには高度すぎるというような回答が好きです。
では得意満面にC++で。
#include<iostream>
#include <algorithm>
#include <array>
#include <numeric>
using namespace std;
int main() {
array<int,200> bingo;
iota(bingo.begin(), bingo.end(), 1);
random_shuffle(bingo.begin(), bingo.end());
for_each(bingo.begin(), bingo.end(), [](int n) { cout << n << ' '; });
}
No.8
- 回答日時:
最近は得意満面になって回答ベタ書きする人が増えましたね。
前回見かけたベタ書き解答は誤回答だったですけど…。
質問者さんのためを思うなら、スマートで適切なヒントを出すべきだと思います。
それか、回答としては間違ってないけど
課題の答えとして提出するには高度すぎるというような回答が好きです。
No.7
- 回答日時:
多分最適と思える方法
n[200]等の配列を容易し、n[0]~n[199]に 1~200 の数字を入れる
準備OK
1回目1個取り出し
0~199 の範囲で乱数を発生させる
仮に 30 だった場合、
画面に n[30]の中身を表示し(画面 n[30]の中身の 31 を表示)
n[30]に n[199]の値を入れる(n[30] の中身は200になる)
2回目1個取り出し
0~198 の範囲で乱数を発生させる ← 範囲を1個狭める事が重要
仮に 50 だった場合、
画面に n[50]の中身を表示し(画面 n[50]の中身の 51 を表示)
n[50]に n[198]の値を入れる(n[50] の中身は199になる)
3回目1個取り出し
0~197 の範囲で乱数を発生させる ← 範囲を1個狭める事が重要
仮に 197 だった場合、
画面に n[197]の中身を表示し(画面 n[197]の中身の 198 を表示)
n[197]に n[197]の値を入れる(n[197]の中身は変わらない)
最適である理由
事前にシャッフルしない
既に出たか確認しない
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- 哲学 人間はカオスだ!?:国家権力の三権分立と神なる三位一体とのフラクタル構造? 56 2022/11/28 17:29
- 労働相談 有給休暇使用時の賃金の計算方法について 5 2022/04/04 00:02
- 大学受験 大学受験 辛い 英語 読めない こんにちは。 現在大学受験をしてる者です。 色々あり浪人なんですけど 11 2022/09/06 12:03
- その他(ビジネス・キャリア) 休憩室に設置したキャビン内での不適切行為に対する事業者としての措置 1 2023/03/04 14:55
- 哲学 政治とは 共同自治であり 愛である。 2 2022/04/02 10:57
- Visual Basic(VBA) Excel VBA 最終行を取得しVlookup関数をコピーする方法をコーディングで教えてください。 3 2023/05/11 13:14
- 政治 農地解放から75年経過してますが、この時の実態調査資料は国民に開示されているのですか? 2 2022/10/29 20:59
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
templete における typedef
-
継承されたABのクラスのポイン...
-
Visial C++おけるπの使い方
-
c++で日本語を処理したい
-
listをvectorにコピーするときに
-
VC++で
-
C++型変換について
-
空白を含む名前のファイル等を
-
C++でのeの近似値の求め方
-
VC++2010での漢字の引数の取り...
-
Linux Ubuntu19.10でQt5.14.1の...
-
違い
-
C++で、テキストファイルを一行...
-
makefileでコンパイルしたい
-
TeXで文書作成しているのですが、
-
C++での <iostream.h>と<iostre...
-
もし~ならば~。
-
VC++のバグ?
-
mainの外に変数 vs ポインタ渡し
-
このプログラミング誰か教えて...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
なぜ、C++の標準ヘッダをインク...
-
switch文のエラーについて
-
VC++で文字列から任意の文字を...
-
構文エラーが出ているのですが...
-
gccでコンパイル時のエラー
-
空ENTERの判別
-
vectorのイテレータを大小比較...
-
JPEGやPNGが読めるLoadImage関数
-
C++で、テキストファイルを一行...
-
std::wstringのメモリリークに...
-
enumの値から定義名を文字列化...
-
CStringとString
-
#define中の#のエスケープ
-
std::map の const 修飾について
-
#include "fstream.h"
-
_tcscat がうまくいきません(V...
-
C言語のポインターで詰まっている
-
構造体配列のvectorへの変換と...
-
C++での <iostream.h>と<iostre...
-
ヘッダーファイルがインクルー...
おすすめ情報