- ベストアンサー
C++の乱数に関して
C++の乱数に関する質問です。 最初に1~100の乱数を1ことり、 二番目に、最初に得られた値以外の1~100の乱数を1ことり、 三番目に、最初と二番目に得られた値以外の1~100の乱数を1ことり、 ・・・・・・・ 100番目に最後に残った乱数で選ばれていない値は1個となるので 1番目から99番目で得られた乱数を見れば、 100番目の乱数が予想できる。 この様な乱数はどの様にすれば得られるでしょうか。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
やり方はいくつかありますが 一番シンプルなのは 最初に1~100の乱数を1ことり、配列に格納 二番目に、1~100の乱数を1ことり、 それが既に配列にあればもう一度取得しなおす 配列になければ配列に格納 三番目に、1~100の乱数を1ことり それが既に配列にあればもう一度取得しなおす 配列になければ配列に格納 他には 最初に1~100の数値を入れた配列を準備 取得するごとに消していく 他には 最初に1~100の乱数を1ことる 二番目に、1~99の乱数を1ことるが、最初にとったものより大きい場合は+1 三番目に、1~98の乱数を1ことるが、すでに取っているものと比べて1つより大きければ+1、2つより大きければ+2
その他の回答 (2)
- m-take0220
- ベストアンサー率60% (477/782)
要素数が100の配列を用意し、1~100の数字を入れる。 0~99の範囲の乱数N1を取得する。 配列の0番目とN1番目を入れ替える。 0~98の範囲の乱数N2を取得する。 配列の1番目とN2+1番目を入れ替える。 0~97の範囲の乱数N3を取得する。 配列の2番目とN3+2番目を入れ替える。 ... 0~(99-i)の範囲の乱数Niを取得する。 配列のi番目とNi+i番目を入れ替える。 ... とすれば、99回乱数を取得することで100個の数字の並びができます。
お礼
m-take0220さま、ご回答ありがとうございます。
- Tacosan
- ベストアンサー率23% (3656/15482)
std::random_shuffle
お礼
実は配列で作ってしまったのですが、 もしかして、これだけでできるんですか?
お礼
できました。 このトピックを参照される方は、下のコードをヒントに自分で作ってみるのも面白いと思います。 自分で作る際には、 「配列」というものを学習する必要がありました。 http://www.asahi-net.or.jp/~yf8k-kbys/newcpp19.html { srand( (unsigned)time( NULL ) ); int r; r = rand() % 10 + 1; for(int x = 1; x < 10000; x++){ if(x == tmondai){ hako[tmondai] = r; nrandom = r; cout << endl; cout <<"第"<<tmondai<<"問に、問題番号"<< r << "が登録されました。" << endl; break; } else if(hako[x] == r) { cout << endl; cout <<"選ばれた乱数は"<< r << "です。" << endl; cout << "乱数を再選択します。" << endl; cout <<"tmondai:"<<tmondai<< endl; Random(); break; } else if(hako[x] != r){ } } } askaaska様、御回答下さりありがとうございます。 教えて頂いたやり方だと、10000回ランダムを取る場合でも簡単にできます! C++をお金を掛けずにネットだけで勉強し初めてまだ4日目ですが、楽しいです。 是非皆さんも趣味で挑戦してみて下さい。