ページ 11

サイコロの目について

Posted: 2016年7月09日(土) 17:24
by HP
C言語でサイコロの目をランダムで表示させたいのですが、5の目しか出てきません

コード:


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

int RollDice(void)
{
  srand((unsigned)time(NULL));
  return (rand()%6+1);
}

int main(void)
{
  int i;
  for(i=0;i<10;i++)
{
  printf("サイコロの目は%dです\n",RollDice())
}
}


Re: サイコロの目について

Posted: 2016年7月09日(土) 17:44
by YuO
srandはrandを呼び出すごとではなく,最初に1回だけ行います。
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: サイコロの目について

Posted: 2016年7月09日(土) 18:10
by HP
直してみて実行してもまだ5が続きます。何度やっても5が続くだけです…

Re: サイコロの目について

Posted: 2016年7月09日(土) 18:21
by box
HP さんが書きました:直してみて実行してもまだ5が続きます。何度やっても5が続くだけです…
そもそも、最初のコードはコンパイルが通らないでしょう。
コンパイルが通らない(つまり実行できない)コードを提示して、
「実行結果がおかしい」と嘆くのは矛盾しています。

コード:

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

int RollDice(void)
{
    return rand() % 6 + 1;
}

int main(void)
{
    int i;

    srand((unsigned) time(NULL));
    for (i = 0; i < 10; i++) {
        printf("サイコロの目は%dです\n", RollDice());
    }
    return 0;
}

Re: サイコロの目について

Posted: 2016年7月09日(土) 18:28
by YuO
HP さんが書きました:直してみて実行してもまだ5が続きます。何度やっても5が続くだけです…
修正したコードはどのようなものですか。
また,コンパイラの名前と,実行している環境のOSは何ですか。

srand関数にどんな値を渡しても,rand関数が{ 6k + 4 (k は 非負整数) }という集合に含まれる値しか返さない,というのであれば,それはライブラリのバグです。
ただ,一般的な環境で使われる標準ライブラリにおいて,そのような単純なバグが存在する可能性は限りなく低いです。