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

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

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

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

Q&A

解決済

3回答

778閲覧

c言語の乱数生成で値の変化があまりないところがある。

minmin231

総合スコア2

C

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

0グッド

0クリップ

投稿2022/01/15 15:35

前提・実現したいこと

srandで乱数の種を設定してプログラムを実行するたびに違った値を出したいのですが、一か所だけ値の変化が極端に少ない部分があります。ほかのところと同じように違った値を出すにはどうすればよいのでしょうか。

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

a=20908
b=19064
c=6153

a=20915
b=7793
c=9113

a=20921
b=29290
c=12073

a=20925
b=7270
c=29938

該当のソースコード

C言語

#include<stdio.h>
#include<time.h>
#include<stdlib.h>

int main(void){
int a,b,c;

srand((unsigned int) time(NULL)); a=rand(); b=rand(); c=rand(); printf("a=%d\n", a); printf("b=%d\n", b); printf("c=%d\n", c); return 0;

}

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答3

0

ベストアンサー

それ、私も経験しました。VSなんたらというコンパイラをお使いではありませんか。
原因はライブラリ関数 rand() の品質が悪いことです。

time() が返す値(実行時刻)が近い値だと、一回目の乱数値も近い値になってしまうようなんです。対策は簡単で、一回目の乱数値を読み捨てること。そのコードだと a=rand(); の、a の値をプログラムの処理に使わないようにします。

Cコンパイラを変えれば rand() の実装も変わる可能性があります。いま私の手元の GCC はバージョン7.3.0という、さほど新しいものではありませんが、それでもそのコードを実行させてみると一回目からばらついてくれます。

a=714820739 b=822221234 c=1609825664 a=865151243 b=1780540312 c=16857573 a=349764032 b=194987552 c=756211649

投稿2022/01/15 23:24

編集2022/01/15 23:44
rubato6809

総合スコア1380

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

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

0

「乱数」の本来の定義から考えると、連続して発生した場合に前の値とは「何の関係もない」ので、逆に言えば近い/同じ値が連続することもある、というのは受け入れる必要があると思います。これは疑似乱数だから値が連続してしまうことがある、というのは全く別の話です。(完全に均等に作られたサイコロがあったとして、そのサイコロでは3~6の範囲だけが10回連続してでることはない、なんて言えませんよね。1000回投げて3~6が700回出るのはおかしくないか、というのはまた別の議論でしょう)

ということで、そもそもrand()が発生するいくつかの値が「見た目バラバラ」であることを期待するのは間違いです。「期待する性質」があるのなら、条件を設定して(直近何個かのデータの分散を見ていくつ以上になるように、とか)満たされないときには値を再発生する等してみてはいかがでしょう。

投稿2022/01/15 22:05

thkana

総合スコア7629

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

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

0

こちらが参考になるかと思います。

■ 【C】srand(time(NULL))をしても同じ乱数が生成される
https://teratail.com/questions/375773

投稿2022/01/15 16:51

cx20

総合スコア4633

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問