• ベストアンサー

ランダムサーチ!!

#include <stdio.h> #include <math.h> float f(float x); float f(float x) { return (float)(x-sin(x)/cos(x)); } void main() { float x1,x2,eps,f1,f2,xm,ff; int i; printf("Bisection method\n\n"); for(;scanf("%g%g%g",&x1,&x2,&eps)!=EOF;){ f1= f(x1); f2= f(x2); if(f1>0){ xm= x1; x1= x2; x2=xm; ff= f1; f1= f2; f2=ff; } printf("\nFinding a root between x1=%g and x2=%g\n", x1, x2); printf("f(x1)=%g f(x2)=%g eps=%g\n", f1, f2, eps); printf("\tx1\t\tx2\t\txm\t\tf(xm)\n"); if(f2<0){ printf("????\n"); continue; } i= 0; for(;fabs(x1-x2)>=eps;){ xm= (x1+x2)/2; ff= f(xm); i++; printf("%2d %15.6e %15.6e %15.6e %15.6e\n",i, x1, x2, xm, ff); if(ff<0) x1= xm; else x2= xm; } printf("A root found between %g and %g\n", x1, x2); } } 上のプログラムはf(x)=x-tanx=0の解のうち3つを表示するプログラムです。この方法をランダムサーチのプログラムと比較したいのですが、プログラムがうまく書けず悩んでいます。よろしければどちらがどのようなメリット、あるいはデメリットがあるのかも教えてほしいです。お願いします。

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

  • ベストアンサー
  • keikan
  • ベストアンサー率42% (75/176)
回答No.2

Cじゃないですが参考文献を見つけたので、 http://mikilab.doshisha.ac.jp/dia/research/person/kouta/report/beat/math/0120/rep0120.htm 周期関数は値を求めるための間隔の決め方が重要になりますね、場合によっては複数ある解の内の1つしか出てこないこともあり得ます。

参考URL:
http://mikilab.doshisha.ac.jp/dia/research/person/kouta/report/beat/math/0120/rep0120.htm

その他の回答 (2)

回答No.3

xm=(x1+x2)/2 としているのを xm=(x1+x2)*((float)rand()/(float)RAND_MAX) にすればランダムサーチになるのでは? rand()は擬似乱数(0からRAND_MAXまで)を返す関数です。 #include <stdlin.h> を追加すれば使えます。 擬似乱数なので時間関数で初期化した方がいいです。 #include <time.h> srand((unsigned int)time(NULL)); を追加するとか。。。 バイナリサーチとランダムサーチの比較は、答えが出るまでの繰り返し回数で比べますか?(変数iの値)

回答No.1

'ランダムサーチ'って何ですか? どんなアルゴリズムですか?

関連するQ&A