C言語でサイコロの目をランダムで表示させたいのですが、5の目しか出てきません
サイコロの目について
Re: サイコロの目について
srandはrandを呼び出すごとではなく,最初に1回だけ行います。
main関数の最初にsrandを呼び出し,RollDiceの中ではsrandを呼ばないようにすればよいでしょう。
---- 以下,問題の起こった背景 ----
srandに同一の値を渡した場合,その処理系のrandは必ず同じ乱数列を返します。
つまり,は,一度コンパイルすれば何度実行しても同一の数値列が出力されます。
# 異なるコンパイラを使えば別の結果がでる可能性がありますが。
それを踏まえた上で,コンピュータの実行速度は非常に早いため,提示されたプログラムにおけるRollDiceの10回の呼び出しにおいて,time()の戻り値はまず変化しません。
結果,srandに常に同じ値を渡しているため,最初のrand関数の戻り値が固定されてしまいます。
これが,同じ値が常に表示される原因です。
再度実行すれば,5ではない値が表示されるかもしれませんが,同じ値が10個表示されることでしょう。
main関数の最初にsrandを呼び出し,RollDiceの中ではsrandを呼ばないようにすればよいでしょう。
---- 以下,問題の起こった背景 ----
srandに同一の値を渡した場合,その処理系のrandは必ず同じ乱数列を返します。
つまり,
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
int i;
srand(1);
for (i = 0; i < 10; ++i) printf("%d\n", rand());
return 0;
}
# 異なるコンパイラを使えば別の結果がでる可能性がありますが。
それを踏まえた上で,コンピュータの実行速度は非常に早いため,提示されたプログラムにおけるRollDiceの10回の呼び出しにおいて,time()の戻り値はまず変化しません。
結果,srandに常に同じ値を渡しているため,最初のrand関数の戻り値が固定されてしまいます。
これが,同じ値が常に表示される原因です。
再度実行すれば,5ではない値が表示されるかもしれませんが,同じ値が10個表示されることでしょう。
Re: サイコロの目について
そもそも、最初のコードはコンパイルが通らないでしょう。HP さんが書きました:直してみて実行してもまだ5が続きます。何度やっても5が続くだけです…
コンパイルが通らない(つまり実行できない)コードを提示して、
「実行結果がおかしい」と嘆くのは矛盾しています。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: サイコロの目について
修正したコードはどのようなものですか。HP さんが書きました:直してみて実行してもまだ5が続きます。何度やっても5が続くだけです…
また,コンパイラの名前と,実行している環境のOSは何ですか。
srand関数にどんな値を渡しても,rand関数が{ 6k + 4 (k は 非負整数) }という集合に含まれる値しか返さない,というのであれば,それはライブラリのバグです。
ただ,一般的な環境で使われる標準ライブラリにおいて,そのような単純なバグが存在する可能性は限りなく低いです。