質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.34%

  • C

    4006questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

乱数を変数に格納したい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 161

h_proc

score 17

乱数を表示させる関数numberを作りました。これをprintf("%d\n",number())で表示させると乱数として表示されるのですが、以下のように変数を設定すると、(10回繰り返した)すべて1が表示されてしまいます。乱数を変数に格納することはできないのでしょうか。対処法を教えていただきたいです。

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

int number(void) {
    return (int)((((double)rand()) / ((double)RAND_MAX + 1)) * 10) + 1;
}

int main(void)

{
    int m = 0;
    m = number();
    for (int i = 0; i <= 10; i++) {
        printf("%d\n", m);
    }
return 0;
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

ループの中で代入しましょうよ


乱数というのは、箱の中にあるたくさんの数字(を書いたボール)からひとつを出してくるようなもんです
出すたんびにデタラメに数字を持ってくるだけのはなしで、
持ってきた数字は、どういじろうが変わりません

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/06 12:45

    回答ありがとうございます。

    キャンセル

  • 2018/12/06 12:57

    乱数を変数に格納し、その変数をswitch文で使うことは可能でしょうか。
    int res = number();
    switch (res) {
    case 1:
    というようなことはできるのでしょうか。

    キャンセル

  • 2018/12/07 19:11

    できます
    ふつうのint変数ですから

    キャンセル

  • 2018/12/10 11:04

    回答ありがとうございます。乱数を変数に格納するとなぜだか1しか出てきません。
    試しに、
    int i = 0;
    i = get_number();
    printf("%d\n", i);
    printf("%d\n", i);
    と実行したのですが、1しか表示されませんでした。どこに原因があるのでしょうか。

    キャンセル

  • 2018/12/10 11:08

    get_number関数のコードがわからないと答えようがないです。提示してください

    キャンセル

  • 2018/12/10 11:19

    大変申し訳ありません。
    int get_number(void)
    {

    return (int)((((double)rand() / ((double)RAND_MAX + 1))*3 )+1);

    }
    よろしくお願いい致します。

    キャンセル

  • 2018/12/10 11:33 編集

    1から3を出したいなら、
    rand()%3+1
    でいいのでは

    キャンセル

  • 2018/12/10 12:20

    ありがとうございます。学校で指定されている方法で作っていて、、、%は使わずに作っています。

    キャンセル

  • 2018/12/10 12:26

    まずは、rand関数の戻り値がどういう数字が出るのかみてみては。

    キャンセル

0

いくつか問題点はありますが、基本的なところからいくと

m = number();                   //ここでランダムに選ばれた数字「1つ」を
for (int i = 0; i <= 10; i++)
{
   printf("%d\n", m);           //ここで11回書き出しているだけ
}


毎回ランダム生成したいのであれば、ループの中に入れましょうということです。

for (int i = 0; i <= 10; i++)
{
   m = number();        //毎回ランダムな数を生成して
   printf("%d\n", m);   //書き出す
}


もしくは、直接関数を呼び出す

for (int i = 0; i <= 10; i++)
{
   printf("%d\n", number());
}


次に、毎回1が出るのはrand()を初期化していないからです。
上記の通り書き換えても、11個ランダムな数がでますが、実行する度に同じ11個の数字が出ます。
詳しくはsrand()を調べてもらうとして、シードにtime()を使うのが一般的です。
ただ、これをnumber()に入れるとループ時に高速で初期化される関係で、同じ数が生成されてしまいます。

良い方法ではありませんが、ややこしいのでとりあえずmain()に追加してみると、
実行する度に11個違う数字がでるようになります。

#include<time.h>
int main(void)
{
srand((unsigned) time(NULL));
・・・


余談ですが、number()は恐らく1~10の数をランダム生成するのが目的なのかなと。
一応rand()で同じことが出来ます。

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

int main(void)
{
    srand((unsigned)time(NULL));
    for (int i = 0; i <= 10; i++)
        printf("%d\n", rand()%10 + 1);
return 0;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/06 12:46

    回答ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C

    4006questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。