サイコロの目について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
HP

サイコロの目について

#1

投稿記事 by HP » 7年前

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())
}
}


YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

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

#2

投稿記事 by YuO » 7年前

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個表示されることでしょう。

HP

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

#3

投稿記事 by HP » 7年前

直してみて実行してもまだ5が続きます。何度やっても5が続くだけです…

box
記事: 2002
登録日時: 13年前

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

#4

投稿記事 by box » 7年前

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;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

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

#5

投稿記事 by YuO » 7年前

HP さんが書きました:直してみて実行してもまだ5が続きます。何度やっても5が続くだけです…
修正したコードはどのようなものですか。
また,コンパイラの名前と,実行している環境のOSは何ですか。

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

閉鎖

“C言語何でも質問掲示板” へ戻る