- 締切済み
無作為に選択
沢山の変数の中から2つを無作為に選び出すには、何を使えばよいでしょうか?
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- Kenichi31980
- ベストアンサー率46% (7/15)
配列 A[n]個の任意の2個を選ぶ方法ですが、 基本的には、rand関数の利用で問題ないと思います。 rand関数の利用方法は、wikipediaをご参照ください。 で、任意の2つということであればあまりを求める rand() % n (範囲0 , n-1) を利用するとよいと思います。 int num[n]; a = num[rand() % n] b = num[rand() % n] このとき問題になるのが、同じ数を2回取ってしまうことです。 それを回避するために、 一度目の値を覚えておいて mem = rand() % n; a = num[mem]; 2回目の値を(n-1)の範囲で求めます tmp = rand() % (n - 1); 次にmemよりtmpが大きければ tmp+1で、配列を参照すればよいでしょう。 if(mem <= tmp) tmp++; b = num[tmp] このケアを正しく行わないと、結果が微妙に異なります。
- dra2jp
- ベストアンサー率25% (18/72)
時間あったんで作ってみました。 もしもこれが宿題なんだったら答えだけ見て終わりにしないで下さいね。 もしもrandの使いかたや、ポインタの使い方がわからなければまた質問してください。 ランダムな数を生成するrand()はstdlib.hをインクルードする必要があります。 精度の低い擬似乱数を用いていますので これは一見でたらめな乱数に見えますが 何度やっても同じ結果にしかなりません。 精度の高い乱数を生成するには今の時間の秒数をとってきてかけてやるとか 初期化を変更するとかする必要があります。 もしも単純な擬似乱数でよければ以下のプログラムでよいと思います。 #include<stdio.h> #include<stdlib.h> int hairetu[100];//どこの関数内でも使えるように宣言 void make_hairetu(){//配列にランダムな数値を格納する関数 int i; for(i=0;i<100;i++) hairetu[i] = rand();//100個の配列要素にランダムな数値を格納 return; } void plus_num_choice(int *x1,int *x2){//x1,x2のアドレス(ポインタ)を得る *x1=rand()%100;//0~99の乱数を取得 *x2=rand()%100;//ポインタの中身に数値を格納 return; } int main(){ int x1,x2; make_hairetu(); plus_num_choice(&x1,&x2);//x1,x2のアドレスを渡す printf("hairetu[%d]+hairetu[%d] = %d\n" ,x1,x2,hairetu[x1]+hairetu[x2]);//表示 return 0; }
- nofutureforyou
- ベストアンサー率9% (25/277)
本当に変数を選びたいのですか? もしかして、値を選びたいだけでは。
- MrBan
- ベストアンサー率53% (331/615)
「無作為」の精度を問わないなら、もっとも単純なのは、 最初にsrandしてからdata[rand()%100]でしょうか。 もしも精度がいるならrandをboost.randomとかに置き換えてみてください。
- MrBan
- ベストアンサー率53% (331/615)
std::random_shuffleとか、randとか、 具体的にどれが最適かは具体的な条件によります。
補足
配列を使って100個の変数を生成しました。こいつらの中から2つを選び出して足したいです。