• ベストアンサー

C++の乱数に関して

C++の乱数に関する質問です。 最初に1~100の乱数を1ことり、 二番目に、最初に得られた値以外の1~100の乱数を1ことり、 三番目に、最初と二番目に得られた値以外の1~100の乱数を1ことり、 ・・・・・・・ 100番目に最後に残った乱数で選ばれていない値は1個となるので 1番目から99番目で得られた乱数を見れば、 100番目の乱数が予想できる。 この様な乱数はどの様にすれば得られるでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

やり方はいくつかありますが 一番シンプルなのは 最初に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

cpp123
質問者

お礼

できました。 このトピックを参照される方は、下のコードをヒントに自分で作ってみるのも面白いと思います。 自分で作る際には、 「配列」というものを学習する必要がありました。 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日目ですが、楽しいです。 是非皆さんも趣味で挑戦してみて下さい。

その他の回答 (2)

回答No.3

要素数が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個の数字の並びができます。

cpp123
質問者

お礼

m-take0220さま、ご回答ありがとうございます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

std::random_shuffle

cpp123
質問者

お礼

実は配列で作ってしまったのですが、 もしかして、これだけでできるんですか?

関連するQ&A

  • C++で乱数発生

    C++で[0,1]区間を100等分した値、つまり0.00以上始まり1.00以下の乱数を発生させ、値ごとに何個現れたかをカウントするには、どうしたらよいのか教えて下さい。私はプログラミングの知識や本等一切ありません。できるだけ詳しく教えてほしいです。

  • 乱数に対して条件に合った値を返すには?

    エクセル2010で 図のようにしたいです。 B列は乱数です。 C列はB列の乱数に応じて値を入力。 図のように セルB5が2の時は、3か4の値、 セルB6が4の時は、1~4の値を入れたいです。 この図例以外にも乱数に対して返したい値がたくさんあるため どのようにしたらいいのかわかりません。 IF関数を使うと思うのですがやり方がわかりません。 また、IF関数以外で「もっとシンプルにできるよ」という やり方があれば教えてください。 ご回答宜しくお願いします。

  • 乱数ってなんですか?

    なんどもすいません。配列のはなしなんですが、まずAという配列の中の0~10番目の中身をランダムに動かして、Bという配列に再編成させたいのですが、 乱数を使えば簡単になるよと知り合いにはいわれたのですが、乱数がどうゆうもの だかあまりよくわかりません。 自分は今VC++のMFCで作ってるのですが、乱数自体がわからないので教えてください。 それとこの方法でいくと日本語の時は配列を2個づつランダムに変えることになると思うのですが、それはぜんぜん予想もできません。教えていただけると助かります。お願いします。

  • 乱数について

    こんばんは。 何度も申し訳ありませんが、今回は乱数について教えてください。 LinuxでCを勉強しているんですが、 randで乱数を発生させることはできたんですが、 そのプログラムを何度実行させても 出てきた乱数は同じ値なんです。 プログラム内で例えば10こ乱数を発生させたとすると 違うものが出ます。 しかし、もう一度そのプログラムをはしらせると 前回と全く同じ並びで同じ数が出るのはどうしてでしょうか? 言ってる意味わかっていただけましたでしょうか? 宜しくお願いします。

  • 乱数を使う

    お世話になっております。 乱数についての質問なんですが、 なんと説明して良いのかわからないので例を挙げます。 コマンドボタンを三つ用意する。 コマンドボタン1をクリックすると、1~3までのランダムな値を表示する。 続けてコマンドボタン2をクリックすると、 先ほど表示した数字以外の1~3までの値を返す。 同様にコマンドボタン3をクリックすると最後に残った数字を表示する。 ってなことがやりたいんですが、 アドバイスお願いします。 あ、あとコマンドボタンを1回クリックすると もう2度とクリックできないようにするなんて事は出来るんですか?

  • C#の乱数取得について

    C#の乱数取得について カテ違いですが、C#のカテゴリがないのでここで質問させていただきます。 C#の乱数取得について調べましたところ以下のプログラムサンプルを見つけました。 1| int seed = Environment.TickCount; 2| string s = ""; 3| 4| for (int i = 0; i < 10; i++){ 5| Random r = new Random(seed++); 6| for (int j = 0; j < 5; j++){ 7| s += r.Next(50).ToString("00") + " "; 8| } 9| s += Environment.NewLine; 10| } 11| this.textBox1.Text = s; C#は勉強し始めたばかりで、まだまだ知識不足なのでこのプログラムが理解できません。 今の自分の知識で考えたことは、 1行目、int型のseedに、C#の乱数を生成するときにデフォルトで設定されるseed値を格納。 2行目、stringクラスのsを定義。 5行目、Random型(?)rにseedを設定 7行目、わかりません。。乱数を取得してることはわかるのですが。 9行目、sに保持。 11行目、GUIに表示。 どなたか、詳しく解説していただけると助かります。 よろしくおねがいします。

  • 乱数の最大値

    C言語で0~Nまでの乱数を発生させる場合、 srand((unsigned) time(NULL)); rand()%N; とやりますよね。 このやり方だと、発生する乱数はRAND_MAX以下しかできません。 RAND_MAX以上の値を発生させるにはどうすればいいのでしょうか?

  • 乱数を発生させるプログラムを教えてください。

    タイトルのままなのですが、1から100までの乱数を発生させるプログラムを知りたいです。 乱数をxとおくと、xの値は、0<x<1の範囲内でお願いします。 C言語で、rand関数を用いて、どうかお願いします。

  • ある乱数生成法により,生成した最初の乱数の値は固定するか確かめて頂きた

    ある乱数生成法により,生成した最初の乱数の値は固定するか確かめて頂きたいです. 0.0から1.0までの一様乱数を発生させる方法です. C言語のコードは以下に載せます. #define IA 16807 #define IM 2147483647 #define AM (1.0/IM) #define IQ 127773 #define IR 2836 #define MASK 123459876 float ran0(long *idum) { long k;   float ans; *idum ^= MASK; k=(*idum)/IQ; *idum=IA*(*idum-k*IQ)-IR*k; if (*idum < 0) *idum += IM; ans=AM*(*idum); *idum ^= MASK; return ans; } この乱数生成法をBVAで,計算の中で繰り返し用いようとしています. idumを任意の整数値に設定・再設定すれば乱数列が初期化されると書いてあったため,idumの値を変えてみましたが,生成された乱数の最初の値は固定されたままでした. そこで,もともとこの乱数生成法がそのようになっているのかを教えて頂きたいです. よろしくお願いします.

  • 大きな数の乱数を作るには

    C 初心者です。 表題のように、unsigned longのスケールの乱数をつくりたいんですが、以下のように記述すると値がいつも同じになります。この理由と、正しく動作するにはどう直したらいいのか教えてください。 unsigned long ul; ul = 4294967295UL * rand() / (RAND_MAX + 1); 値は常に131071でした。

専門家に質問してみよう