こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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;
}

投稿日時 - 2009-09-12 23:46:52

QNo.5285044

困ってます

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

とりあえず、コンパイルエラーのメッセージくらいは掲示した方がよいかと思われますが…

>int = i;

こんな書式はないかと。

>i = rand();
>srand((unsigned)time(NULL));

疑似乱数生成した後で、その疑似乱数生成の種を変更したところで影響しません。
コンパイルエラーを修正しても何度実行しても結果はおそらく変わらないでしょう。

>if(i % 2 == 0)

コンパイラ次第…かも知れませんが、変数のスコープ外れています。

投稿日時 - 2009-09-13 00:00:42

補足

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

投稿日時 - 2009-09-13 00:12:09

お礼

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

投稿日時 - 2009-09-13 01:45:30

ANo.1

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

あれ?
printf("偶数である:\n",i);
の部分は
printf("偶数である:%d\n",i);
としたかったのかな、と思っていたのですが。

rand、srandに関してはもう回答が出ていますが、rand関数はプログラムが始まった時点では毎回同じパターンのランダム値を返すことに注意ですね。

投稿日時 - 2009-09-13 01:40:43

お礼

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

投稿日時 - 2009-09-13 01:55:51

ANo.4

#1さんの回答にも目を向けてください。

srandを呼び出すのは、
randを呼び出す「前」です。

投稿日時 - 2009-09-13 01:34:55

お礼

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

投稿日時 - 2009-09-13 01:47:59

ANo.3

変数のスコープとは宣言した変数の有効範囲のことです。
詳しいことは参考書等に乗っているとは思いますが、上の場合

{
  int i; /* 修正しました */
  i = rand();
  srand((unsigned)time(NULL));
  printf("%d\n",rand());
} /* ここで i の有効範囲終わり */

と{}でわざわざ囲っているために、変数iがif(i % 2 == 0)まで生きていないということです。
なので、今回はわざわざ{}で囲む必要はありません。

それと、下の二つのprintfの使い方が間違ってますね。

投稿日時 - 2009-09-13 00:34:33

補足

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です。

投稿日時 - 2009-09-13 00:52:20

ANo.2

Wr5

>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()を抜けるまで存在しているとは思われますが…

投稿日時 - 2009-09-13 00:33:21

あなたにオススメの質問