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

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

新規登録して質問してみよう
ただいま回答率
85.47%
C++

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

Q&A

解決済

3回答

2351閲覧

乱数を実行ごとではなく, 関数の呼び出しごとに異なる値を発生させたい.

rosbergf1

総合スコア13

C++

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

0グッド

0クリップ

投稿2018/05/11 10:14

前提・実現したいこと

実行ごとではなく, その都度に異なる乱数を代入したい.

配列を10000個用意して14の乱数を発生させています.
1
4の値が発生する確率は, 25%ずつだと考えられますので,
1は2500個, 2は2500個, 3は2500個, 4は2500個
という風になるようにしたいのですが, 下のようになってしまいます.

発生している問題

$ ./XCSC 1は0個, 2は10000個, 3は0個, 4は0個 $ ./XCSC 1は0個, 2は10000個, 3は0個, 4は0個 $ ./XCSC 1は0個, 2は0個, 3は10000個, 4は0個 $

該当のソースコード

c++

1#include<stdio.h> 2#include<stdlib.h> 3#include<math.h> 4#include<time.h> 5#include"MT.h" 6 7 8/*[0,1]の一様実乱数発生*/ 9double MT(void) 10{ 11 init_genrand((unsigned)time(NULL)); 12 return genrand_real1(); 13} 14 15/*乱数分類(乱数に基づいて,1~n(引数)の値を返す)*/ 16int cla(int n) 17{ 18 init_genrand((unsigned)time(NULL)); 19 return genrand_int32()%(n)+1; 20} 21 22int main() { 23 int a[10000]; 24 int i, j, k, l, m, n; 25 k = 0; 26 l = 0; 27 m = 0; 28 n = 0; 29 for(i=0; i < 10000; i++) { 30 a[i] = cla(4); 31 if(a[i] == 1) 32 k++; 33 if(a[i] == 2) 34 l++; 35 if(a[i] == 3) 36 m++; 37 if(a[i] == 4) 38 n++; 39 } 40 printf("1は%d個, 2は%d個, 3は%d個, 4は%d個\n" , k, l, m, n); 41 return 0; 42} 43

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

init_genrandをmain関数の先頭で一度だけ呼べば良いです。
逆に言うと複数回呼んではいけません。

投稿2018/05/11 10:17

LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rosbergf1

2018/05/13 04:53

ありがとうございました。おかげで欲しい乱数が使えてよかったです。
guest

0

init_genrand((unsigned)time(NULL));

現在時刻(秒)をシードに乱数を初期化する。
同じシードで初期化して先頭だけ使うと毎回同じ値になっちゃいますね。

ルイスさんの言うとおり一回だけ呼ぶようにすれば直ります。
スコープの見通しをきにするならstatic変数使うと綺麗に書けると思います。

投稿2018/05/11 10:27

set0gut1

総合スコア2413

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rosbergf1

2018/05/13 04:52

ありがとうございました。static変数の勉強にもなりました。
guest

0

参考情報

  • C言語による乱数生成

http://www.sat.t.u-tokyo.ac.jp/~omi/random_variables_generation.html#Prepare_rand

> ... > #include <stdio.h> > #include "MT.h" > > int main(void){ > int i; > init_genrand(10); > for(i=0;i<100;i++){ printf("%ld\n",genrand_int32());} > } > ...

上で init_genrand(...)を for ループの中で呼んだらどうなるかをためしてみると良いです。

投稿2018/05/11 15:29

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問