まず、以下のような”実行するたびに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ランキング
-
C言語で%を使わない余りの出し方
-
分数の足し算をさせるプログラ...
-
nCrの計算
-
C言語
-
カードシャッフルのブログラム...
-
CppUnitはCプログラムにも使え...
-
intとlongは同じ?
-
ハフマン符号化の問題を解くプ...
-
C++で表を作成したいのです ...
-
プログラミング
-
VC++でコマンドラインから引数...
-
C言語 サイコロ 2つの値を返せない
-
2÷3などの余りについて
-
比較回数と交換回数表示について
-
信頼区間の1.96や1.65ってどこ...
-
nCmの関数
-
複数桁10進数の*桁目だけを抽出...
-
Notepad++の関数リスト表示の変...
-
C言語のfor文です。 繰り返しの...
-
break文でループを一気に抜ける...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
2の補数を計算するプログラム
-
intとlongは同じ?
-
再起呼び出しの回数をカウント...
-
C言語で%を使わない余りの出し方
-
迷路を脱出する経路探索プログ...
-
画像の拡大・縮小
-
分数の足し算をさせるプログラ...
-
C言語で簡単なパックマンゲーム...
-
C++で表を作成したいのです ...
-
条件が多い場合
-
複数の共有メモリの作成
-
ヒストグラム均等化処理プログラム
-
3のつく数と3の倍数を表示 C言語
-
argvのNULLチェック
-
乱数で交互に偶数、奇数が、、、。
-
プログラミングに関して
-
OpenCVによる4値化について
-
再帰処理をループ処理に変換
-
16bitで乱数を生成する方法
-
C++ Debug Errorについて教えて
おすすめ情報