• ベストアンサー

何故、同じ動きをするのでしょうか?

C++の勉強を始めて1ヶ月程の者です。(独学ですが・・) 練習にとレースをするプログラムを組んでみたのですが、 コンパイルして実行すると、2つあるクラスから作られた インスタンスがそれぞれ同じ動きをしてしまい、上手く行きません。 乱数の生成に問題でもあるのでしょうか? 原因が解らず困っています。どなたか教えて頂けないでしょうか。 Borland C++ 5.5を使っています。OSはXPです。 よろしくお願いします。 (補足にソースを載せておきます。)

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

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

補足はわかりませんが、 (1)乱数を作り出す関数を(rand()?)呼ぶ前に乱数初期化をしていますか? していたのなら、 (2)インスタンス生成の時に毎回行っていませんか? たぶん(2)じゃないかと思うのですが。 乱数初期化関数(srand()など)を使うと、乱数の出る数を毎回変えることができます。 しかし、初期化の種には「現在時刻」を使うことが多いので、 短い時間のうちに複数回乱数初期化をすると、同じ数値を返してきます。 乱数初期化は、「プログラムの始めに1回、しかも1回だけ行う」のが正しい作法です。

senzin
質問者

お礼

早速の回答有り難うございます。 仰るとおりでした。 クラスの関数内にsrand()を入れていましたので・・ それを削除し、main関数に移したら上手く動くようになりました。 もう必要ないとは思いましたが、一応ソースの全文を記入しておきます。 本当に有り難うございました。

senzin
質問者

補足

ソースの全文です。 #include<stdlib.h> #include<conio.h> #include<string> using namespace std; class NormalCar{ string name; int iti; public: NormalCar(){ name="車"; iti=0; } ~NormalCar(){} void running(); getIti(){return iti;} }; void NormalCar::running(){ int x,i; srand((unsigned)time(NULL)); x=(rand()>>4)%5; if(x<2){ for(i=0;i<(1+iti);i++){ cout<<" "; } iti+=1; }else{ for(i=0;i<(2+iti);i++){ cout<<" "; } iti+=2; } cout<<name<<endl; } class SuperCar{ string name; int iti; public: SuperCar(){ name="超"; iti=0; } ~SuperCar(){} void running2(); getIti(){return iti;} }; void SuperCar::running2(){ int x,i; srand((unsigned)time(NULL)); x=(rand()>>4)%6; if(x<4){ for(i=0;i<(iti+1);i++){ cout<<" "; } iti+=1; }else if(x==4){ for(i=0;i<(iti+3);i++){ cout<<" "; } iti+=3; }else{ for(i=0;i<(iti+4);i++){ cout<<" "; } iti+=4; } cout<<name<<endl; } class Hantei{ int gorl; public: Hantei(){} ~Hantei(){} int ender(int x); }; int Hantei::ender(int x){ if(x>=30){ cout<<"ゴォォォ~ルッ!!"<<endl; return 2; }else{ return 3; } } int main(){ int daisu,spdaisu,hanteikekka,sa,i; NormalCar *normal; SuperCar *spcar; cout<<"レースを始めます。"<<endl; cout<<"参加台数を決めて下さい。(5台以下です。)"<<endl; cin>>daisu; cout<<"スーパーカーの台数を設定します。"<<endl; cout<<"台数を指定して下さい。"<<endl; cin>>spdaisu; sa=daisu-spdaisu; normal=new NormalCar[sa]; spcar=new SuperCar[spdaisu]; Hantei sinpan; do{ for(i=0;i<sa;i++){ cout<<i+1<<"号車:"; normal[i].running(); hanteikekka=sinpan.ender(normal[i].getIti()); } for(i=0;i<spdaisu;i++){ cout<<sa+i+1<<"号車:"; spcar[i].running2(); hanteikekka=sinpan.ender(spcar[i].getIti()); } cout<<"何かキーを押してください。"<<endl; getch(); }while(hanteikekka==3); delete [] normal; delete [] spcar; }

関連するQ&A

  • eclipseのコンパイルエラーについて

    現在、Eclipse+borlandでdirectxのプログラムを作成しています。 しかし、eclipseでコンパイルをするとコンソールに ”プログラムが大きすぎてメモリに入りません”とエラーが 表示されます。 borlandでコンパイルをすると問題なく実行ファイルが生成されます。 eclipseでコンパイルする場合は、設定が必要なのでしょうか?

  • MSILのような中間言語について

    調べたところ、http://www.atmarkit.co.jp/icd/root/63/57773363.html で、「マイクロソフトは、MSILを生成できるプログラム開発環境として、.NET Framework SDK(コマンドライン・ベースのプログラム開発環境を提供するソフトウェア・セット)やVisual Studio.NET(グラフィカル・インターフェイスを備えたプログラム開発環境)を開発し、いずれも2000年末から開発者向けのベータ版ダウンロード・サービスを開始した。」とあるのですが、同じC言語で作っていてもBorlandでコンパイルしたものと、VisualStudioのC++でコンパイルしたものでは実行のされ方が異なっているのでしょうか? また、こういったプログラムのコンパイルや実行に関して、OSはどの様に関わっているのでしょうか? よろしくお願いします。

  • C言語で乱数がうまく効きません。下記のソースでコンパイルして実行すると

    C言語で乱数がうまく効きません。下記のソースでコンパイルして実行すると結果が130固定となってしまいます。 #include <stdio.h> #include <stdlib.h> int main(void){ int x; x = rand(); printf("%d",x); return 0; } 使っているコンパイラはBorland C++ 5.5.1です。何か間違いでもあるのでしょうか?よろしくお願いします。

  • 乱数 メルセンヌツイスターについて

    メルセンヌツイスター法(MT法)について少し調べることになったのですが、メルセンヌツイスターのサイトにC言語のソースがあったので動かしてみました。 確かに乱数が発生するのですが、ソースをみてもどういう動きで乱数を生成してるのかがわかりません。 メルセンヌツイスターはどうやって乱数をつくりだしているのでしょうか? わかる方がいらっしゃいましたら、教えてください。

  • Borland C++ Builderで簡単なC言語プログラムの作成・実行

    Borland C++ Builderで簡単なCのプログラムを作り実行させるにはどうしたらよいですか? DOS窓上でコンパイルするのではなく、Borland C++ Builderのメニューから行いたいのです。 一応、「ファイル→新規作成→その他→Cファイル」でCのファイルは作成できるのですが、このファイルを「プロジェクト→ユニットのコンパイル」でコンパイルすることができません。 Formオブジェクト(?)を作成しておくとコンパイルできます。 Formは特に必要ないので、FormなしでCのファイルだけをコンパイルしたいのです。 DOS窓でのコンパイル・実行はできます。 事情があってBorland C++ Builderを使わなくてはなりませんので、他のIDEはこの際全く解決になりません。 よろしくお願いします。

  • JAVAコンパイルと実行

    はじめまして。質問があります。 eclipseで開発したjavaのソースを実行するとき、メニューからメインクラスを指定し実行するだけでプログラム実行されますが、そのプログラムをコマンドプロンプトで実行する場合、できるプログラムとできないプログラム(例外:NoClassDefFoundError)があります。 コンパイルはeclipceのほうで勝手に.classファイルが生成されるので、そのclassファイルをjava [ファイル名]と打つだけだと思います。 実行できるプログラムとできないプログラムの違いは以下の通りです。 ・実行できるプログラム eclipseで新規でプロジェクトを作成。その直下にソースが存在し、クラスファイルも同じディレクトリに生成されます。 ・実行できないプログラム eclipseで新規でプロジェクトを作成。ソースフォルダ(src)を作成し、その下からパッケージ、クラスを作成しました。そうすると、エクスプローラでそのプロジェクトを見ると、binフォルダが生成されていました。その中にクラスファイルが生成されます。 違いはこのような感じです。実行できないプログラムをコマンドプロンプトで実行させるためにはどうしたらよいでしょうか?eclipseの使い方はだいぶわかってきたのですが、どのように動作しているか(java自体も)がわかりません。ご教授宜しくお願い致します。 OS:windows2000 開発環境:eclipse 3.0(J2SE 1.4.2_03)

    • ベストアンサー
    • Java
  • 最長周期系列(M系列?)の生成プログラム(C言語)

    擬似乱数などに使用される最長周期系列をシフトレジスタ数nを入力として生成するプログラムを探しているのですが、どれだけ探しても乱数生成のプログラムはあっても最長周期系列のほうのプログラムが見当たらないのです。 C言語で探しています。 ソースコードも含めてどうかよろしくお願いします。

  • コンパイラによってエラーが出たり出なかったり

    構造体をポインタでつなぐリスト構造を使ったソースを書いて、Borland C++ Compiler 5.5 でコンパイルしたものを実行するとエラーで止まってしまいました。 コンパイル時には何も警告が出ませんでした。 しかし、ソースを何度見てもバグらしいコードが見つからなかったので、試しに Microsoft .NET Framework SDK でコンパイルしてみたところ、こちらも警告も出ずにコンパイルが通って、実行してみたらこんどは正常に動作しました。 コンパイラによって、実行時にエラーが出たり出なかったりするということは初めてなのでその原因を知りたくて質問しました。 どういった場合にこのようなことが起こるのでしょうか。 Borland C++ で出たエラーは、おそらくセグメントエラーだと思います。 今のところ正常に動いているのですが、なにかデンジャラスなコードを書いてしまった気がして気持ち悪いです。

  • BCCで出来るのにVCだと出来ない。

    あるソースをborlandでコンパイル(メイク)して実行するとうまくいくのですが そのソースをVisual stdioでコンパイルして実行するとエラーが出てしまいます。 このようなことが普通あるのでしょうか? それともVisual Stdioのどこかがおかしいのでしょうか?

  • Cコンパイラーのついてのご質問です。

    Cの勉強をしようとして、 MS-DOSを開いて、 bcc32 sample11.cといれてコンパイルをしようとしたんですが、『 C:\source>bcc32 sample11.c Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland sample11.c: Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Fatal: ファイル C0X32.OBJ が開けません C:\source>    』のようにでてきましたどうすれば良いのでしょうか?教えてください。 (ちなみに、今回のプログラムは #include <stdio.h> main() { printf("Hello!"); return 0; } です初めてのプログラムなので簡単です。)初めてプログラミングを勉強するので、できれば、詳しくお願いします。