MATLABの乱数生成関数rand()について

このQ&Aのポイント
  • MATLABの乱数生成関数rand()について説明します。
  • rand()関数は、[0, 1]の範囲で一様乱数を生成します。
  • rand('state', sum(100*clock));という書き方をすることで、乱数の生成状態を指定することもできます。
回答を見る
  • ベストアンサー

MATLABの乱数生成関数 rand( ) について

一様乱数を生成する関数rand()について  ・Y = rand(n);  ・rand('state',sum(100*clock));   Y = rand(n); という2つのやり方があるようなのですが,以下のmatlabの関数の説明 のページをみても2つの違いが理解できません. http://infoshako.sk.tsukuba.ac.jp/ShakoDoc/MATLAB5/jhelp/techdoc/ref/rand.html どういう違いがあるのでしょうか? また,この関数は[0,1]の一様乱数としていますが,[-a,a]みたいに範囲指定はできないのでしょうか? 回答よろしくお願いします.

質問者が選んだベストアンサー

  • ベストアンサー
  • sgwjn
  • ベストアンサー率70% (47/67)
回答No.1

Y = rand(n); は乱数発生器が固定されています。 ですので、rand関数を実行するたびに同じルールに従って乱数を生成します。 対して、 rand('state',sum(100*clock)); Y = rand(n); は使用する乱数発生器を実行時の時間を基準に決定します。 ですので、rand関数を実行するたびにルールを変更して乱数を生成します。(変更した結果、同じルールが選択される場合もあります) 任意の範囲で正負を付けたい場合は、例えば以下のようにすれば可能です。 例:-1000~1000の乱数の場合 (1) 乱数1生成 (2) 乱数2生成 (3) Ans = 1000 * 乱数1 (4) 乱数2が奇数の場合 Ans = -Ans

marucha
質問者

お礼

回答ありがとうございました. 違いが理解できました. 乱数発生器を実行時の時間を基準に決定するほうがよさそうなので そちらを採用しようと思います. 区間指定方法も回答を参考にさせていただきます.

関連するQ&A

  • 乱数の生成方法

    乱数を生成するソースコードを探しています rand関数で生成される乱数はよい乱数ではないようで それ以外でいい乱数を生成する方法はどのようなものがあるのでしょうか また、実装したソースコードのサンプルがあればWEBページなどを教えていただきたいです

  • 分布関数が与えられた時の乱数の生成

    下記のような分布関数に関して質問です。 W(x) = lim_{m to 8} 1/C exp(-A sum_{k,j=1}^{m}(x_k * x_j)) ------------------------------ ここで lim_{m to 8} : mが無限大まで sum_{k,j=1}^{m} : kとjがmまでの総和 A, C: 定数です。 x : 作成したい乱数です。 ------------------------------ コンピュータ上にて、このような分布関数を持つ乱数を生成する というのはどういう方法があるのでしょうか? 手がかりだけでも教えていただければと思います。

  • こんな条件を満たす乱数生成関数教えてください

    1.任意の周期を指定できる 2.種を指定できる(直前の生成値を引数にとる) 3.逆関数が定義できる 4.生成された乱数 x、y の距離を(定数時間で)求められる   つまり y = f(x) ならxとyの距離は1、 y = f( f( f(x) ) ) なら距離3、というように 乱数としての質(均等に分布していること)はあまり重視しません。 ビット幅は32~128bitくらい(任意ならベスト)であればいいと思っています。 以下のような感じにしたいです。  int rand(x, p);   // 戻り値 y = f(x)、pは周期、xは直前の乱数値  int inv(y, p);   // 戻り値 x = f^-1(y)  int distance(x, y) // y = f(f(x)) のとき、distance(x, y) = 2 で distance(y, x) = -2 一応以下の関数が条件1~4を満たすのですが、残念ながら乱数としての性質が皆無なので使えないです。  int rand(x, p) { return (x+1) % p; }  int inv(y, p) { return y ? y - 1 : p-1; }  int distance(x, y) { return y - x; } よろしくご教授お願いします。

  • 毎回違う乱数を生成するにはどうしたらいいでしょうか

    C言語の初心者です。よろしくお願いいたします! 乱数に関する質問:毎回違う乱数を生成するにはどうすればいいでしょうか。 学校の講義の中に  >>time() は1970 年1 月1 日0 時0 分(標準時)からの経過秒数を返 すため,1 秒以内に何度も実行すると,同じ数字で乱数を初期化す ることになり,結果も同じになってしまう. という記述がありますが、時間を置いてから、実行しても同じ結果となりました。 その一 #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> int main(void) { double x,y; int i,index=0; double a,n; printf("How many trials?..."); scanf("%lf",&n); for (i=0;i<n;i++) { x=rand()/(RAND_MAX+1.0); y=rand()/(RAND_MAX+1.0); if((x*x+y*y)<1) index++;} a=4*index/n; printf("Result is %.2f(%.2f)",a,sin(-a)); return 0; } その二 #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int a; srand((unsigned)time(NULL)); a=(int)(rand()/(RAND_MAX+1.0)*10); printf("%d\n",a); return 0; } お忙しい中、教えていただけたらうれしいです。

  • RAND関数です

    お願いします。 A1~A20までに入力枠があります この数値は他の箇所より参照しています。 このA1~A20の数値に対してB1~B20に=RAND()で乱数を発生するようにしていますが、ただ、データー入りがA1~A20行が最大で、A1~A7までの時とか毎回変化します。当然、データーの入っていない行にも乱数が発生します。 =IF(ISERROR(RAND()))、” ”、((RAND())))) で表示させないようにとしましたが、できません。 関数の」組み合わせ?マクロのコード? いい方法がありませんでしょうか、宜しくお願いします。

  • MATLABについて

    Matlabで行列の絶対値の平均値を求めるにはどうすればよいですか? 以下の行列noiseの各要素の絶対値の平均値が知りたいのですが。 t = linspace(0,1,100); randn('state',sum(100*clock)+0); noise=randn(size(t));

  • Matlabのspdiags関数

    Matlabのspdiags関数に関してわからないところがあります。以下はMatlabのヘルプWebページから持ってきた例です。http://dl.cybernet.co.jp/matlab/support/manual/r2006/toolbox/matlab/math/?/matlab/support/manual/r2006/toolbox/matlab/math/sparse4.shtml B = [ 41 11 0 52 22 0 63 33 13 74 44 24 ]; d = [-3 0 2];、m=7, n=4のとき A = spdiags(B,d,7,4) A = (1,1) 11 (4,1) 41 (2,2) 22 (5,2) 52 (1,3) 13 (3,3) 33 (6,3) 63 (2,4) 24 (4,4) 44 (7,4) 74 これに対応するフル行列Aは、つぎのようになります。 full(A) ans = 11 0 13 0 0 22 0 24 0 0 33 0 41 0 0 44 0 52 0 0 0 0 63 0 0 0 0 74 mやnというのはfull(A)がm行n列の行列であるというイメージの対応がわかるのですが、d = [-3 0 2]とfull(A)の行列の関係がわかりません。-3,0,2というのはfull(A)のどこを見れば良いのでしょうか。

  • メルセンヌツイスターによる乱数の使い方

    メルセンヌツイスターによる乱数を生成したいのですが、下記コードにすると、mt_rand関数を呼ぶたびにシードが初期化され他乱数が生成されます。 やりたいことは、main関数で一度シード101で初期化した後は、mt_rand関数内では、初期化することなく継続した乱数を生成したいのです。 そのためa_mt_rand関数のようにすると、mtが定義されていないとなるエラーとなります。 namespaceの問題と思うのですが、色々試してみましたが、できませんでした。 どのようにすればできるでしょうか。 vc++11、windows11 使用 参考サイト C++ 乱数ライブラリ std::random の使い方 リンクはうまく貼れませんでした。 #pragma hdrstop #include <iostream> #include <stdio.h> #include <random> using namespace std; void mt_rand(void); int main(int argc, char *argv[]) { int ptr; std::mt19937 mt(101); // メルセンヌツイスターの32ビット版、引数は初期シード std::uniform_int_distribution <> rand100(0, 100); // [0, 99] 範囲の一様乱数 ptr = rand100(mt); printf("ptr=%d\n",ptr); mt_rand(); } void mt_rand(void) { int ptr=0; std::mt19937 mt(101); // メルセンヌツイスターの32ビット版、引数は初期シード std::uniform_int_distribution <> rand100(0, 100); // [0, 99] 範囲の一様乱数 ptr = rand100(mt); printf("%d\n",ptr); } void a_mt_rand(void) { int ptr=0; ptr = rand100(mt); printf("%d\n",ptr); }

  • r()を0以上1未満の一様乱数を返す関数とする。

    r()を0以上1未満の一様乱数を返す関数とする。 rand(A, B) (A∈ℝ, B∈ℝ, A<B)をr()を用いて、A以上B未満の一様乱数を返す関数となるように定義したい。

  • MATLAB で配列みたいなものを

    乱数を発生させて、ヒストグラムに表示させたいのですが、 内部関数のrandをつかわずに 例えば、乗算型合同法 x(n+1)=15x(n) mod (10^6+1)               x(0)=1 (x(n)を15倍して10^6+1で割ったあまりをx(n+1)とする。) で発生する数列x(n)を100万でわって0~1の乱数列が発生します。 これをヒストグラムで表したいのですが、いまいち分かりません。どうかよろしくお願いします。 内部関数を使ったものは簡単で n=10000; x=rand(1,n); hist(x); で1万個の乱数の分布がわかるのですが。 ばからしい質問ですいません。

専門家に質問してみよう