- ベストアンサー
順不同について
- 順不同について解説します。問題の出題順序が毎回変わるため、どの都道府県の問題がどの順番で出題されるかをプログラムで設定する必要があります。
- 具体的なコードの書き方を説明します。問題のリストを作成し、その中からランダムに10個の問題を選び出し、順番に出題するようにします。
- 順不同の問題出題は、問題の順序をランダムにすることで実現できます。ランダム関数を使用して、問題リストからランダムに問題を取り出し、順番に表示するようにします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
配列に乱数を使って適当なデータを代入しこれをソートして上位(または下位)の10個を出力するようにします 起動するたびに乱数の元を変更するには srandなどに timeなどを与えましょう // indexはクラス変数またはグローバル変数にする char index[47]; char ken[47]; int n, i, j, tmp; // 起動するたびに乱数を変化させる srund( (unsigned int)time(NULL) ); // 配列を初期化 for( n = 0; n < 47; n++ ) { ken[n] = rand(); index[n] = n; } // 並べ替え for( i = 0; i < 46; i++ ) { for( j = i+1; j < 47; j++ ) { tmp = ken[i]; tmpI = index[i]; if ( tmp > ken[j] ) { ken[i] = ken[j]; ken[j] = tmp; index[i] = index[j]; index[j] = tmpI; } } } といった具合に初期化しておいて // 配列 mondaiに出題用のデータがあるとします // cntに0から9までを与えて出題する void Shutudai( int cnt ) { char buf[256]; strcpy( buf, mondai[ index[ cnt ] ] ); SetWindowText( hWndLabel, buf ); } といった具合でしょう
その他の回答 (4)
- Werner
- ベストアンサー率53% (395/735)
重複を許したくないのであれば 0~46を配列に入れてシャッフルします。 そしてシャッフル後の配列から順に値を取り出せばよいです。 シャッフルのアルゴリズムは Fisher-Yatesシャッフル(かそれに準じるもの)を使うのがよいでしょう。 Fisher-Yates shuffle - Wikipedia, the free encyclopedia http://en.wikipedia.org/wiki/Fisher-Yates_shuffle 配列のシャッフル http://ray.sakura.ne.jp/tips/shaffle.html 余談: シャッフルが話題になったことは何度かあるけど なぜかFisher-Yatesを提示する人が少ない気がする。 シンプルなシャッフル方法だと思うんだけど、なんでだろう。 そして、遅い上に一様性にも問題があるアルゴリズムが提示されたりする。
- JaritenCat
- ベストアンサー率37% (122/322)
10個の中に同じ問題がないという制限が必要ならこんなのはどうでしょう。 県のデータが47個あるはずですので、 ・0~46の乱数を2個作って該当番目の県データを入れ替える ・上記を何十回かやれば県データがランダムに並ぶ ・0番から9番までの10個を出題する 10問でなく47問を重複なくランダムに出題する場合でも有効です。
- arain
- ベストアンサー率27% (292/1049)
関連。 http://okwave.jp/qa4215205.html http://okwave.jp/qa4215205.html ここで書かれている「AnsiString prefecture[]」 の要素0~46の値をとる乱数を発生させ引数として使用する。 同じ内容が重複するのが嫌であれば、使用したかどうかを確認するための配列を作成し、その配列に使用した値を入れ、乱数発生時に配列の値と一致した場合は再度乱数を発生させるようにする。
お礼
ご回答ありがとうございます。
- asuncion
- ベストアンサー率33% (2127/6289)
北海道:0、 青森県:1、 … 沖縄県:46 のように、都道府県にユニークな番号をつけます。 0~46の範囲の乱数を発生させるコードを書けば、 都道府県の登場の仕方は順不同になると思います。
お礼
ご回答ありがとうございます。 参考になりました。
お礼
ご回答ありがとうございます。 早速やってみます。
補足
実はc++Builder6を使っています。昨日教えていただいた内容をやってみましたが結局できなくて、せっかく教えて下さったのにすみません。そして、とりあえず 「47都道府県のうちから10個順不同に出題され、 どの都道府県の問題がどの順番で出題されるかはプログラムが起動される度に毎回変わります」を除いて作成して見ました。ここでこの問題のコードを教えていただけないでしょうか?よろしくお願いします。 if(pre==9){ ShowMessage(IntToStr(total)+"問正解です。"); //Close(); return; } this->Edit1->SetFocus(); AnsiString prefecture[]={"北海道","青森県","岩手県","宮城県","秋田県","山形県" ,"福島県","茨城県","栃木県","群馬県","埼玉県","千葉県","東京都","神奈川県","新潟県" ,"富山県","石川県","福井県","山梨県","長野県","岐阜県","静岡県","愛知県","三重県" ,"滋賀県","京都府","大阪府","兵庫県","奈良県","和歌山県","鳥取県","島根県","岡山県" ,"広島県","山口県","徳島県","香川県","愛媛県","高知県","福岡県","佐賀県","長崎県" ,"熊本県","大分県","宮崎県","鹿児島県","沖縄県"}; AnsiString seat[]= {"札幌市","青森市","盛岡市","仙台市","秋田市","山形市" ,"福島市","水戸市","宇都宮市","前橋市","埼玉市","千葉市","新宿区","横浜市","新潟市" ,"富山市","金沢市","福井市","甲府市","長野市","岐阜市","静岡市","名古屋市","津市" ,"大津市","京都市","大阪市","神戸市","奈良市","和歌山市","鳥取市","松江市","岡山市" ,"広島市","山口市","徳島市","高松市","松山市","高知市","福岡市","佐賀市","長崎市" ,"熊本市","大分市","宮崎市","鹿児島市","那覇市"}; n=-1; m=-1; total=0; for(int i=0;i<10;i++){ if(prefecture[pre]==prefecture[i]){ n=i; break; } } for(int j=0;j<10;j++){ if(Edit1->Text==seat[j]){ m=j; break; } } if(n==m){ ShowMessage("正解です"); pre++; cnt++; ShowMessage(pre); total=cnt+total; Label1->Caption=prefecture[pre]+"の県庁所在地はどこですか?"; Edit1->Text=""; return; } else{ ShowMessage("不正解です。正解は"+seat[pre]+"です"); pre++; Label1->Caption=prefecture[pre]+"の県庁所在地はどこですか?"; Edit1->Text=""; }