質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

5926閲覧

新・明解C言語 中級編の自由課題 演習1-1

Canta

総合スコア9

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2016/04/11 20:28

###前提・実現したいこと
ここに質問したいことを詳細に書いてください

新・明解C言語 中級編の自由課題 演習1-1を解いているのですが、srandでわからないことがあります。演習内容はコンパイルした際にランダムでおみくじゲームをしてくれる単純なプログラムです。

###発生している問題・エラーメッセージ

作られる乱数がずっと2のままになっています。
エラーは出ていません。

###該当のソースコード
#include <time.h>
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int num;
srand(time(NULL));
num = rand() % 7;

printf("おみくじをします。\n"); if(num == 0) printf("大吉\n"); else if(num == 1) printf("中吉\n"); else if(num == 2) printf("小吉\n"); else if(num == 3) printf("吉\n"); else if(num == 4) printf("末吉\n"); else if(num == 5) printf("凶\n"); else printf("大凶\n"); printf("乱数は %d です。\n", num); //乱数値テスト用 return 0;

}

###試したこと
色々調べてみましたが、何故か乱数を7で割った場合のみその後も固定されてしまいます。

###補足情報(言語/FW/ツール等のバージョンなど)
言語 C
FW Mac OSX Yosemite

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

MacOSX 10.11.4, xcode 7.3 で同じ現象を確認しました。
time(null) "c" srand 7
で google 検索してみました。

参考情報:

...
擬似乱数発生のアルゴリズムに欠陥がある
...
どうもMac+Xcode特有の問題のようです。
...

乱数表の冒頭は捨てるのがよさそうです。

修正例:

c

1#include <time.h> 2#include <stdio.h> 3#include <stdlib.h> 4int main(void) 5{ 6 int num; 7 srand(time(NULL)); 8 // 最初の乱数を捨てる 9 for (int i = 0; i < 10; i++) { 10 rand(); 11 } 12 13 num = rand() % 7; 14 printf("おみくじをします。\n"); 15 16 if(num == 0) 17 printf("大吉\n"); 18 else if(num == 1) 19 printf("中吉\n"); 20 else if(num == 2) 21 printf("小吉\n"); 22 else if(num == 3) 23 printf("吉\n"); 24 else if(num == 4) 25 printf("末吉\n"); 26 else if(num == 5) 27 printf("凶\n"); 28 else 29 printf("大凶\n"); 30 31 printf("乱数は %d です。\n", num); //乱数値テスト用 32 33 return 0; 34}

こうすると、毎回、異なる結果が得られました。

投稿2016/04/11 21:09

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Canta

2016/04/11 23:17

修正例まで頂きありがとうございます!解決いたしました!!
guest

0

これと同じ現象だと思います。

Mac、iOSで、rand()関数の疑似乱数アルゴリズムがヘン!

このページの最後のほうのコメントで言及されているように、最初に何度かrand()を空呼び(最初の何回かの値を棄却)するのが一番簡単な対処法だと思います。検尿の時と同じです。

投稿2016/04/11 21:03

sharow

総合スコア1149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Canta

2016/04/11 23:16

ありがとうございます!解決いたしました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問