【お題】王手、そして

沢山の変数の中から2つを無作為に選び出すには、何を使えばよいでしょうか?

A 回答 (5件)

配列 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]

このケアを正しく行わないと、結果が微妙に異なります。

参考URL:http://ja.wikipedia.org/wiki/Rand
    • good
    • 0

時間あったんで作ってみました。


もしもこれが宿題なんだったら答えだけ見て終わりにしないで下さいね。
もしも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;
}
    • good
    • 0

本当に変数を選びたいのですか?


もしかして、値を選びたいだけでは。
    • good
    • 0

「無作為」の精度を問わないなら、もっとも単純なのは、


最初にsrandしてからdata[rand()%100]でしょうか。
もしも精度がいるならrandをboost.randomとかに置き換えてみてください。

参考URL:http://boost.cppll.jp/HEAD/libs/random/
    • good
    • 0

std::random_shuffleとか、randとか、


具体的にどれが最適かは具体的な条件によります。

この回答への補足

配列を使って100個の変数を生成しました。こいつらの中から2つを選び出して足したいです。

補足日時:2006/07/05 12:42
    • good
    • 0

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


おすすめ情報