- ベストアンサー
C言語で遺伝的アルゴリズムを使った乱数のグループ分け
- C言語で遺伝的アルゴリズムを使って乱数のグループ分けを行うプログラムについての質問です。
- プログラムを実行するとsegmentation faultが発生することがあり、その原因が分からないため回答を求めています。
- 目的は与えられた乱数を2つのグループに分け、2つのグループの差をなるべく小さくすることです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
Segmantation Fault は領域外へアクセスしたときに発生するもので、プログラム上の原因は次のようなものがほとんどです ・確保させていない領域にアクセスした NULL、freeした後の領域等 ・配列の添字が範囲外 ですから、まずは、上記の点問題無いかを調べます。 エラーなくコンパイルできたかどうかは関係ありません。 で、プログラムを全部チェックするのは面倒ですが、それでも、斜め読みでもわかるくらいおかしな点を http://okwave.jp/qa/q8589069.html で指摘させていただきましたが、今回のプログラムでもまったく直ってません。 (rand()/32767); おそらく、[0,1]の乱数を期待しているようですが、2つの理由から、そうはなっていません。 そのことは理解できていますか?
その他の回答 (2)
- Wr5
- ベストアンサー率53% (2173/4061)
なんというか…いまいち読む気にならないですねぇ……。 # define定義と変数が入り交じる感じで読みにくい。 とりあえず…… >if(rand()/32767 < Mutation_ratio){ >abc = (Number_of_gene-1) * (rand()/32767); の結果は正常なんですかね? # abcが0から(Number_of_gene-1)の範囲に間違いなく収まります? ご使用の環境ではRAND_MAXはいくつなんでしょう? # 32767というマジックナンバーは…なんでしょう?? ちなみに…私なら除算ではなく剰余を使いますけどね。 abc = rand() % Number_of_gene; とか。(これならNumber_of_gene以上の値にはならないのでバッファオーバーランしないし)
- kngj1740
- ベストアンサー率18% (197/1052)
直接の回答にはなりません。開発環境のデバック機能を利用して、落ちるところ(直前?)を突き止め、ロードマップなどを参照してどのステートメントかを突き止める。あるいはソースレベルデバッグが可能な開発環境ならさらに楽です。そこの変数を確認、多分、配列の大きさを超えてアクセスしようとしてるのでは。乱数発生で行われているため、毎回同じ結果にならないだけと思います。
お礼
RAND_MAXは理解し、訂正したのですが訂正前のものをのせてしまいました。 無事解決できました。 ありがとうございます。