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

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

ただいまの
回答率

90.98%

  • C++

    2944questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Visual Studio

    1500questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

読み込んだ値をランダム関数を用いた処理で返したい

解決済

回答 3

投稿

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

harrier

score 6

現在C++の関数を自作しており、取得した値に対しランダム関数を用い、値の更新を行う関数を作成しています
作成した関数は以下の通りです。

int getrandom(uchar x){
srand(time(NULL));
int pattern = rand() % 21 - 10;
int x1 = x;
x1 = x1 + pattern;
return x1;
}
対象を画像ピクセルの値としているため読み込みをucharとしており、その値へint型で発生するランダム値を加算してint型でmainへと返すものにしています。そのために一度”int x1 = x;”という式を組み込んでいます。
ここで,毎回入力する値のxがprintfで出力すると,x=0の時にランダム関数で発生する値がマイナスとなります。
これは偶然なのでしょうか?毎回マイナス値となるのはおかしいと思い質問しました。何か解決策をご存知の方、お答えいただければと思います。
よろしくお願いします。

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+2

こんにちは。

特に関係する部分が見当たらないので偶然のような気がします。
数回プログラムを別途起動してみて、毎回x=0の時、乱数が負になるならば、何かあるとは思いますが、謎ですね。

ところで、毎回、srand(time(NULL));するのは止めた方がよいです。
恐らく短時間の間に繰り返し呼ぶと思いますが、time(NULL)が返却する時刻の単位は意外に大きいです。1秒とか1ミリ秒とか。その間、毎回同じ種で乱数が処理化されるため、毎回同じ乱数が生成されます。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/10/18 16:48

    こんにちは
    コメントありがとうございます。
    確かに短時間に何度も使用する関数ですのでご指摘の通り修正したいと考えておりました。
    実際にsrandはどちらに配置すべきなのでしょうか?

    キャンセル

  • 2017/10/18 16:53

    srandはプログラム開始時に一度呼べば十分。一体何回seedを変更する気なんだい?

    キャンセル

  • 2017/10/18 21:37

    srand()を呼ぶのは乱数列を初期化したい時です。時刻で初期化するのであればyumetodoさんの言うとおり、プログラムの起動時に1回呼べば大抵の場合OKです。
    逆いn実用ではなく学習用であれば、srand(123);のような固定とし、常に同じ乱数列を発生させた方がデバッグが容易になりますよ。

    キャンセル

  • 2017/10/18 22:21

    学習用じゃなくてもシュミレーションなんかでseed固定したいことはありますね

    キャンセル

checkベストアンサー

+1

int pattern = rand() % 21 - 10;

変数patternの値域は-10 <= pattern  <= 11ですから、xが0のとき戻り値の値域はやはりおなじになりますから負になることはなんら不思議ではありません。

またすでに指摘のある通りseedを毎回初期化するのは意味不明かつ、提示のコードの場合極めて高い確率で毎回同じ値が生成されるのでやめましょう。

ところでC++をお使いとのことですが、C++においてrand関数の使用は非推奨になっています。C++11で追加されたstd::random_deviceおよびstd::mt19937の利用を強く推奨します

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/10/18 16:50

    コメントありがとうございます。
    別のランダム発生の関数を試してみようと思います。
    また、少し言葉足らずだったのですが、x=0とした時に"常に"負の値が帰ってきてしまうことで現在頭を悩まされておりました。

    キャンセル

  • 2017/10/18 16:52

    https://wandbox.org/permlink/nIbFnkqMaM9H4bNa
    当方の検証では運が良ければ正の値も出ています。

    キャンセル

  • 2017/10/18 16:55 編集

    >別のランダム発生の関数を試してみようと思います。

    rand/srandはC++においては使うべきではないので、この辺見てがんばってください
    http://siv3d.hateblo.jp/entry/2013/02/17/231829
    https://cpplover.blogspot.jp/2009/11/c0xrandom.html

    キャンセル

  • 2017/10/18 16:56

    確認しました。再度トライしています。
    ありがとうございます。

    キャンセル

+1

x=0の時にランダム関数で発生する値がマイナスとなります。

rand()%21 は 0~20 だから
pattern = rand()%21 - 10 がマイナスになるのは当然あり得る。
x1 = x; x1 = x1 + pattern; は x = 0 なら x1 = pattern; なので 
pattern < 0 であったなら、そりゃマイナス値が返ってくるでしょ。

それはそうと、呼び出しのたんびに srand(time(NULL)) してるのはなぜ?
これだと短時間に何度も getrandom(x) すると毎回同じ値が返ってくるよ?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/10/18 16:43

    コメントありがとうございます。
    書き方が悪かったですが、x=0とした時に発生するpatternの値が"常に"pattern<0となってしまっていまい、悩んでおります。

    キャンセル

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

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

関連した質問

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

  • C++

    2944questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Visual Studio

    1500questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。