- 締切済み
PICマイコンによる乱数の表示について
度々こちらで、お助け頂いております。 さて、今回の主旨はPICマイコンによりLCD表示器へ6個の数字を 表示する方法についてご質問させていただきました。 プログラミングはPIC用コンパイラCCS社のCコンパイラを使用し、 Micro chip社のMPLABと統合動作させています。 一般的なC言語と異なる部分があり、扱づらい面のあるコンパイラです。 では、問題のソースコードを次に記述します。 細部の設定や定義は省いて記述してあります。 1.void main() 2. { 3.int data,i; 4.srand((unsigned)time(ULL)); 5.data = 0; 6.表示器の初期化 7.カーソル位置をHomeへ 8.while(1) 9.{ 10.入力信号判定式 11.for(i = 0; i < 6; i++) 12. { 13. data=rand( )%6 + 1; 14. printf(lcd_data"%3d",data); 15. } 16.入力信号判定式 17.break; 18. } 19. } 以上、これだけのソースコードですが、コンパイルすると、 行番4コードがコンパイルエラーとなります。 (※英語のメッセージは読取れません。(勉強不足)) PICに関するrand( )とsrand( )関数について、いろいろと調べてみましたが、 それらに該当する項目が見当たりません。 そこで、行番4の部分をsrand(data);に変更したら、何とかコンパイル成功します。 それをPICに書込み、ターゲットに実装試験してみると、 100回乱数表示のうち、18回同じ組合せの数が出てしまいます。 どうも、srandの初期化が上手く出来てないみたいですが・・・ 何処が不具合となっているのでしょうか? また、同じソースコードをパソコンの標準Cで試してみると、 130回とも全てランダムに画面表示されます。 そこでどなた様か、PICに詳しい方のお知恵を拝借し、 ご指南頂けるなら、大変幸いに思います。 何卒宜しくお願い申し上げます。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- kmee
- ベストアンサー率55% (1857/3366)
> 行番4コードがコンパイルエラーとなります。 > (※英語のメッセージは読取れません。(勉強不足)) 読んでください。それができないなら、そのメッセージをコピーして、ネットで検索したり翻訳したりしてください。 質問するにしても、そのメッセージが無いとなんとも言えません。 > srand((unsigned)time(ULL)); ・NULLの打ち間違いですか?ULLのままですか? ・PICマイコンって時計内蔵してるんですか?時計が無ければ、現在時刻を返すtime関数を正常に動作させるのは無理ですよね。 マニュアルちょっと見る限り、time関数は用意されていないようですが。 エラーメッセージを読めば、上の間違いなら、「ULLなんて知らない」とか「timeなんて知らない」とか書いてあるはずです。 > そこで、行番4の部分をsrand(data);に変更したら、何とかコンパイル成功します。 > それをPICに書込み、ターゲットに実装試験してみると、 > 100回乱数表示のうち、18回同じ組合せの数が出てしまいます。 randは、疑似乱数といって、一見バラバラに見えますが、実際はsrandを初期値として使って計算で求めた値です。 なので、srandで指定した「種」が同じだと、乱数の出方も同じになります。 そのため、実行のたびに違う値になって欲しいときは、実行のたびに変わるような種を使います。 time、つまり「現在時刻」を使うのは、そのための手段の一つです。 宣言しただけで、まだ値を代入していない変数dataを使った場合、メモリの内容は不定なので、種として機能することもあるでしょう。しかし、時刻を使った場合にくらべて「前回と同じ」になる可能性が大きいです。
お礼
kmee 様 早速のご回答頂きまして有難うございました。 順を追っていろいろと、検索やら試をしているうち、 お礼と、結果報告が遅くなり申し訳ございません。 PICマイコンとCCS-Cコンパイラは、やはりtime.hが扱われないようですね。 エラーメッセージから、”使用定義されてない機能”と解読できました。 行番4行目の(ULL)は、こちらの記述ミスで、(NULL)が正しいコードです。 time関数が使用できないとなれば、また別の方法がないのか、 考えてみようと思います。 ご親切な解説ありがとうございました。