次に、問題となる4桁の数字を生成します。
どうしたらいいでしょうか?
トランプを使って、ランダムな4桁の数字を作ることを考えてみます。
トランプは、同じカード(ジョーカーは除く)ってないよね。
この手順を、アルゴリズムとして0~9の数字を使ってやってみましょう。
#include <cstdio> using namespace std; int main() { srand((unsigned int)(time(nullptr))); //被らない4桁のランダム数を作りたいから //"123456789"をシャッフルする char temp[] = "1234567890"; //0~9までのかぶらない数を準備 //100回くらいシャッフルしたらランダムでしょう。。。 for (auto i = 0; i < 100; i++) { int randnum1 = ********** //0~9の乱数1 int randnum2 = ********** //0~9の乱数2 //indexがrandnum1の要素とrandnum2の要素を交換する ****************************************; } //実体作っておかないと怒られるよ char resStr[]="0000"; //配列の初めから4つ取り出してresStrにコピー for (****************) { resStr[i] = *******; } //出来上がった4桁のかぶらない数列を表示(stringだからそのまま送ると表示できる) printf("NUMBER: %s", resStr); return 0; }
#include <iostream> using namespace std; int main() { srand((unsigned int)(time(nullptr))); //被らない4桁のランダム数を作りたいから //"123456789"をシャッフルする string temp = "1234567890"; //0~9までのかぶらない数を準備 //100回くらいシャッフルしたらランダムでしょう。。。 for (auto i = 0; i < 100; i++) { int randnum1 = ********** //0~9の乱数1 int randnum2 = ********** //0~9の乱数2 //indexがrandnum1の要素とrandnum2の要素を交換する ****************************************; } //実体作っておかないと怒られるよ string resStr="0000"; //配列の初めから4つ取り出してresStrにコピー for (****************) { resStr[i] = *******; } //出来上がった4桁のかぶらない数列を表示(stringだからそのまま送ると表示できる) cout << resStr; }
今後、プログラムを効率よく作るために、問題生成を関数化し、以下のように使えるようにしたい。
C++のコードだけど、わかるよね?
#include <iostream> using namespace std; //void MakeProblem(string& question) C++の人 void MakeProblem(char question[5]) //Cの人 { //char temp[] = "0123456789"; /* 11バイト (\0 含む) Cの人*/ //string temp = "0123456789"; //C++の人 //0~9の乱数を2個出して、その2つのインデックス temp[x]とtemp[y] (0<= x,y <= 9)の中身を交換 //を適切な数くらい(よく混ざる程度)繰り返す //tempの頭から4文字分を、question[0]~question[3]+question[4]='\0'を作って返す //って言ってもreturnじゃなく引数で返すパティーン } int main() { srand((unsigned int)(time(nullptr))); //ここで、関数呼び出し。 //関数は文字列を返すのでそのまま出力 cout << MakeProblem() << endl; //printf("%s\n", MakeProblem()); }
戻り値の型 関数名は、
とする。
引数は、特に必要ないのでなし(void)でよい。
つくったら、上のソースコードのように表示してみて、何回か実行したときに別の4桁の数字が出てくることを確認しよう!