![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
まず、以下のような”実行するたびに1~6の数字をランダムに出力するプログラム”を
作ってみたのですが、特定の数字が出てこないのです。
例えば、1と4、2と5、3と6 が出ない
ここで気がついた事は、
1、出ない目の2数の差は3であること。
2、乱数自体を表示させたところ、ちゃんと1秒毎に乱数は変わっている。こちらには問題はない
3、約1分間隔で、出ない数字の組み合わせが変わる。
(例えば 1,3,4,6,1,6,3,6,4(2と5が出ない)
→1分間実行し続けると・・・ 2,3,6,5,3,2,2,6(1と4が出ない))
この原因は一体なんなのでしょうか・・・
とても気になって仕方がありません。わかる方教えてください。
以下、ソースコードになります
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int func(void);
int main(void){
int number=0;
number=func();
//サイコロの目の表示
printf("%d\n",number);
return 0;
}
int func(){
//乱数の初期化
srand((int unsigned)time(NULL));
//サイコロの目をランダムで出力し、返す
return rand()%6+1;
}
プログラムの仕組みは
パソコンから現在の歴時刻を元に乱数の初期値を変更
↓
rand関数で適当な値を受け取り、6で割った余剰+1を計算し値を返却する
No.2ベストアンサー
- 回答日時:
randでは「疑似乱数」といって、実際には計算で次の「乱数」を求めています。
直前の(計算方法によっては複数の)「乱数」を覚えておいて、次の「乱数」を計算しています。
そして、最初の状態を求めるのに使う値が「種(シード)」と呼ばれるものです。種が同じなら、同じ乱数列になります
種を設定するのがsrandです。
例えば。
あるときsrand(1)でrand()=1,3,5,4 ... となったら
srand(1)とすれば、いつでも最初のrand()は1、次は3,次は5...となります。
さて、この疑似乱数は、その計算方法によってはあまり「乱数っぽくならない」ことがあります。
種が近い値の場合、乱数が近くなってしまうアルゴリズムもあります。
質の悪い乱数だと、一見バラバラに見えて、よくよく見ると、特定ビットに短い周期性が見られたりします。
6で割ったあまり、というのは上位ビットより下位ビットの影響が大きくなります。そして、「下位ビットに注目すると、全パターン出てこない」などということは有りえます。
おそらく、この複合で起こっているのでしょう。
・srandで初期化するのは、普通は最初の1回だけです。
・もっと上の位を使うようにする。例えば、rand()/(double)RAND_MAX*6.0と、全体を使うとか、 (rand () >> 4)%6 等と下位を捨てるとか
・rand自体があまり質のいい乱数ではないので、別のアルゴリズムを使う。
参考URL:http://www001.upp.so-net.ne.jp/isaku/rand.html
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
intとlongは同じ?
-
C言語で%を使わない余りの出し方
-
2の補数を計算するプログラム
-
再起呼び出しの回数をカウント...
-
画像の拡大・縮小
-
迷路を脱出する経路探索プログ...
-
分数の足し算をさせるプログラ...
-
OpenCVによる4値化について
-
3のつく数と3の倍数を表示 C言語
-
C言語で簡単なパックマンゲーム...
-
ヌメロンのプログラム
-
C++で表を作成したいのです ...
-
複数の共有メモリの作成
-
カードシャッフルのブログラム...
-
whileとifを使い偶数を出すには
-
関数とビット列
-
【C#】SQL文の中に変数を埋め込...
-
異なるn個の整数からr個の整数...
-
c言語プログラミングについて f...
-
条件が多い場合
おすすめ情報