• ベストアンサー

srand(time(NULL))の使い方

C言語の勉強中で「ランダムな整数値を作成し、その数値が偶数か奇数かを判定するプログラムをif~else 構文を使って作成」したいのですが下記のプログラムでやってみたのですがまだまだ知識不足で完成しません。知識をお借りできればと思っていますのでどなたか教えてください。 #include<stdio.h> #include<stdlib.h> #include<time.h> int main(void) { { int = i; i = rand(); srand((unsigned)time(NULL)); printf("%d\n",rand()); } if(i % 2 == 0) { printf("偶数である:\n",i); } else { printf("奇数である:\n",i); } return 0; }

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

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.1

とりあえず、コンパイルエラーのメッセージくらいは掲示した方がよいかと思われますが… >int = i; こんな書式はないかと。 >i = rand(); >srand((unsigned)time(NULL)); 疑似乱数生成した後で、その疑似乱数生成の種を変更したところで影響しません。 コンパイルエラーを修正しても何度実行しても結果はおそらく変わらないでしょう。 >if(i % 2 == 0) コンパイラ次第…かも知れませんが、変数のスコープ外れています。

kazu3kikun
質問者

お礼

ありがとうございました。 i = rand(); srand((unsigned)time(NULL)); これをいれかえましたらできました。理解度が悪くて不愉快にさせて申しわけありませんでした。 次のステップに向けて頑張りたいとおもいますのでまたアドバイスをいただければ嬉しいです。

kazu3kikun
質問者

補足

エラー表示を乗せ忘れ、大変失礼しました。 int = i; をとり、実行したところ エラーE2451 10:未定義のシンボル i(関数main) 1errorsとでてしまいました。 変数のスコープとは何でしょうか? 忙しい中返答ありがとうございます。

その他の回答 (4)

  • LOHA
  • ベストアンサー率52% (203/388)
回答No.5

あれ? printf("偶数である:\n",i); の部分は printf("偶数である:%d\n",i); としたかったのかな、と思っていたのですが。 rand、srandに関してはもう回答が出ていますが、rand関数はプログラムが始まった時点では毎回同じパターンのランダム値を返すことに注意ですね。

kazu3kikun
質問者

お礼

printf("偶数である:%d\n",i); とやってみたら、 8200 偶数である:1330 と二種類の数字が出てしまったのでわからなくなってしまったので抜きました。 きっと srand((unsigned)time(NULL)); i = rand(); のつかいかたが悪かったのかと思います。 いろいろありがとうございました。また質問する場合がありましたら語教授お願いします。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.4

#1さんの回答にも目を向けてください。 srandを呼び出すのは、 randを呼び出す「前」です。

kazu3kikun
質問者

お礼

asuncionさんの言うとりでした。 Wr5さんのをしっかりと理解できなかった自分のせいでした。ご指摘ありがとうございます。

  • LOHA
  • ベストアンサー率52% (203/388)
回答No.3

変数のスコープとは宣言した変数の有効範囲のことです。 詳しいことは参考書等に乗っているとは思いますが、上の場合 {   int i; /* 修正しました */   i = rand();   srand((unsigned)time(NULL));   printf("%d\n",rand()); } /* ここで i の有効範囲終わり */ と{}でわざわざ囲っているために、変数iがif(i % 2 == 0)まで生きていないということです。 なので、今回はわざわざ{}で囲む必要はありません。 それと、下の二つのprintfの使い方が間違ってますね。

kazu3kikun
質問者

補足

LOHAさん返答ありがとうございます。 下記のように{}はずして、printfを直し、Wr5さんに支持してもらって直してみたところ実行はできたのですがランダム整数が偶数しか出てこないのですが奇数ですという答えがでないのですが原因はなんでしょうか? #include<stdio.h> #include<stdlib.h> #include<time.h> int main(void) { int i; i = rand(); srand((unsigned)time(NULL)); printf("%d\n",rand()); if(i %2 == 0) { printf("偶数である:\n"); } else { printf("奇数である:\n"); } return 0; } 実行結果 22068 偶数である: 使用しているのはborlandです。

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.2

>int = i; >をとり、実行したところ というのは >{ >int = i; >i = rand(); >srand((unsigned)time(NULL)); を >{ >i = rand(); >srand((unsigned)time(NULL)); と、改悪したわけでしょうか? C言語では使用する変数は事前に宣言が必要です。 http://ja.wikipedia.org/wiki/%E5%A4%89%E6%95%B0_%28%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%29 「iという変数(と思われるモノ)が未定義だ。」というエラーです。 iがint型なのか、char型なのか、何らかのポインタなのか…コンパイラは解りません。 なお、コンパイラの仕様(準拠している言語仕様)次第で、ブロックの先頭でのみ宣言できるか、使用直前でも宣言可能かは変わります。 >変数のスコープとは何でしょうか? 上に掲示したwikiページに書かれてます。 (消されてしまいましたが)int型変数のiはブロック中で宣言されていますのでブロックの外では使用できません。 wikiページに書かれている「寿命」という点では、今回のコードではおそらくほとんどのコンパイラでmain()を抜けるまで存在しているとは思われますが…

関連するQ&A