C++の乱数に関する質問です。


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

この様な乱数はどの様にすれば得られるでしょうか。

A 回答 (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
    • good
    • 0
この回答へのお礼

できました。
このトピックを参照される方は、下のコードをヒントに自分で作ってみるのも面白いと思います。

自分で作る際には、
「配列」というものを学習する必要がありました。
http://www.asahi-net.or.jp/~yf8k-kbys/newcpp19.h …

{
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日目ですが、楽しいです。
是非皆さんも趣味で挑戦してみて下さい。

お礼日時:2011/04/22 20:51

要素数が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個の数字の並びができます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/04/22 20:52

std::random_shuffle

    • good
    • 0
この回答へのお礼

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

お礼日時:2011/04/22 20:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング