
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{int y, m, l;
srand( (unsigned)time( NULL ) );
y=rand() % 2500 + 1600;
m=rand() % 12 + 1;
l=rand() % 29 + 1;
printf("西暦%d年%d月%d日",y,m,l);
return(0);
}今回は乱数発生でランダムにだされた西暦年月日をつくりましたが、y=rand() % 2500 + 1600;
というのがありこれはyという乱数が2500以下1600以上という意味なのですがなぜかプログラムを実行しても3000いくつとか4000いくつなんてのもでてきます。m=rand() % 12 + 1;はちゃんと12以下1以上でできるのですがなぜですか?本当にわかりません。是非だれか教えてください。
No.1ベストアンサー
- 回答日時:
> y=rand() % 2500 + 1600;
> yという乱数が2500以下1600以上という意味なのですが
違いますよ。1600以上、4100未満のはずです。
「rand() % 2500」だけで0以上2500未満になるんですから。
No.2
- 回答日時:
よく考えてみましょう。
rand() が仮に2499を返したとすると、rand() % 2500 は
2499になります。そしてそれに1600を加えるわけですから、
この場合のyは 4099 になります。
つまりこの式を以って 1600 <= y <= 2500 の範囲にしようというのは
正しくないということです。
剰余によってある範囲に収めるのなら、その剰余を求めるのを最後に行わなければ
いけないのでは?
rand() % 12 + 1 がうまく行っているように見えるのは、
rand() % 12 がとる範囲が 0 ~ 11 で、それに1加えているので
1 ~ 12に収まっているからです。
なるほど!完全に勘違いしてました!罠ですね。
正しくはy = rand() % 901 + 1600; でしたーやっと理解できましたーすごい感動。みなさんもひっかかりませんでした?こんなミスとは思いませんでした。数字が大きすぎるからできないのかなーとか思っていました。笑
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# プログラミングペーパーテスト 次の問題の実行結果を答えろ #include int x[ ] = { 1 2022/06/16 21:49
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
関連するカテゴリからQ&Aを探す
おすすめ情報
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
おすすめ情報