• ベストアンサー

乱数とは?

乱数について、いくつか疑問に思っていることがあります。 乱数の定義は? 辞書には、 0から9までの一〇種類の数字が、それぞれ同じ確率で現れるように並べられた数字の列。 と、書いてあります。 と言うことは、各数字の現れる確率は10%です。 大量にDATAを取れば限りなく10%に近づくと言うことです。 そこで、 DATAが少ないと乱数にも偏った値が出て各数字10%にはなりません。 と言うことは、 各数字の発生確率が偏っている段階では、 次に現れる数字の予測がある程度可能だと思っていいのでしょうか? 確率の低い数字が出る確率が高い? そうなると、 予測が可能だと乱数とは言えないのではないでしょうか? 結果として確率が均等になればいいのであって、予測が出来る出来ないは関係ない?

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

  • ベストアンサー
  • iow
  • ベストアンサー率71% (5/7)
回答No.4

まず,確率と頻度という二つを明確に区別された方が良いと思います. 予測についてもどうなった場合に予測ができたとするかについて明確に 定義する必要がありますが,とりあえずこれは置いておきます. 「確率」の定義にはふれませんが,「確率」というのは事象の背後に 隠れていて,データの出現を左右するもので,データには依存しません. それに対して「頻度」とは実際に (各データの出現した数÷データの長さ)で,データに依存します. 0~9までの一様乱数に限定しますと,それぞれの出現確率は10%です. おっしゃるとおり,一様乱数でも0だけn個並んだ数列は出現します. (※その出現確率は(1/10)のn乗で,非常に小さいですが.) オール0の数列においては0の頻度は1で他の数字の頻度はすべて0です. つまり,データが少ないと各数字の頻度は0.1ずつにならない可能性 も十分あります. ですが各数字の出現確率は(一様乱数なら)0.1で不変です. ですから0がn個続いたあとでも一様乱数であれば次に各数字が出現する 確率は常に(1/10)です.ということで,予測した数字と実際に出た数字 が一致する確率は今までどのような数字が出てきたかに関わらず, (1/10)を越えることはありません. (※もちろん当たった頻度は(1/10)と一致するとは限りません.) わかりづらい文章ですいません.

satou03
質問者

お礼

回答ありがとうございます。 確率と頻度 奥が深い回答ですね。(^_^;) 確率は未来で、 頻度は過去? 一緒にして考えるから、おかしくなるんですね。 分けて考えるとわかりやすいです。 今後ともよろしくお願いします

その他の回答 (3)

  • mays
  • ベストアンサー率30% (13/42)
回答No.3

よくある「乱数表」の正式な作り方です。 正20面体のさいころを振って、出た数字を書き連ねる。 このような作り方なので、別に初めの100個の中に1が全くなかったとしても、次に1が出る確率は1/10です。 ただ、コンピュータに作らせる場合、alfeimさんのおっしゃるとおり、ある一定の法則にのっとって作られるらしいので、ある程度法則があるらしいです。 また、余談ですが、人に、ばらばらに数字を100個、とか書いてもらうと必ず何か法則ができるらしいです。(1の後に1のくる確率が1/10より小さい、とか。)

satou03
質問者

お礼

回答ありがとうございます。 サイコロとコンピューターと人間では、全く別な乱数が出来るんですね。 コンピュータは正直すぎる?(^_^;) 今後ともよろしくお願いします。

回答No.2

1)この種の問題は、適確な「定義」を専門辞書などで得られるかどうかが、納得の行く答えがでるかどうかの分岐点になると思います.  2)この種の問題は、数学への根本的な問題を含んでいるやもしれず重要なものだと感じます. (とは言え答えはすでにあることが多い). がんばって納得行く回答が得られると良いですね. 3)さて、以下素人の論ですが…乱数には、一様乱数、正規乱数、擬似乱数等があります(理化学辞典:乱数の項による). satou03さんの辞書で見た定義は、この理化学辞典中にある乱数の中では「一様乱数」にやや近いようです. そこで、以下では一様乱数に全く限定して話をします. 一様乱数の定義は(理化学辞典によると)「0と1の間で一様に分布する実数の乱数列のこと.実際に計算機で生成するには,0とある正整数mの間の整数Xn(n=1,2,…)を近似的に等確率,■かつ相互に独立に■なるように発生させ,Xn/mとして生成する.」とあります(■は回答者による挿入).この■…■の部分が曲者と感じます.相互に独立、ということは、それまでの出現履歴に関係なく、という意味だとすれば、satou03さんの推定(それまでの出現履歴に関係して次の発生確率が影響される)は、単に定義に反するため、誤りということになります. 単純な話になりましたが、このような議論を、理化学辞典でなく数学の専用辞典を用いて展開することで、明快な回答に近づくと思われます. 実際、理化学辞典でも、上記のように多少のあいまい性が感じられる定義なので、もしかすると大変難しい領域なのかもしれませんね.

satou03
質問者

お礼

回答ありがとうございます。 一様乱数?正規乱数?疑似乱数? 新たな疑問が生まれてしまいました。(^_^;) でも、これらを調べていくうちに、求める答えが見えてくるかもしれません。 今後ともよろしくお願いします。

  • alfeim
  • ベストアンサー率58% (114/195)
回答No.1

それって辞書の定義が少し変なのではないですか? 私が知っている乱数の定義は 無限回試行した場合、すべての数の出現確率が等しくなるもの です 無限回というのが重要で、これが有限回数だった場合、確率は当然偏ります さいころを一回だけ振って出た目が1だった場合、1の目の確率は100%、他の目の確率は0%という事になります。 これが >各数字の発生確率が偏っている段階 に相当するわけです。しかし次に出やすい目が決まったりはしませんよね? >次に現れる数字の予測がある程度可能だと思っていいのでしょうか? については、たとえばさいころを振って6が連続して10回出たとしても、次に振ったとき6が出る確率は1/6です。 なぜなら以前に出た数に依存して次の出目が変わるわけではありませんので・・・ なので >次に現れる数字の予測がある程度可能だと思っていいのでしょうか? は予測不可能です。 >確率の低い数字が出る確率が高い? はすべて等しいです。 ただコンピュータで使われる乱数は疑似乱数なので、ある程度の周期性が存在し、予測可能であったりします。

satou03
質問者

お礼

回答ありがとうございます。 「無限回」と言うところと、 「以前に出た数に次の目が依存しない」と言うところがポイントですね。 コンピュータで乱数を作ると結構早い段階で確率が均等になってしまいます。 均等になることが正しい乱数だと思ってました。 出る数字も、むら無く均等に散らばってるものが、正しい乱数だと思ってました。 ですが、均等になると言うことで、前半の数字で後半の数字がある程度予測(傾向を予測)されてしまうと言う小さな悩みを持ってました。 しかし、無限回試行した段階で均等になればいいのであって、普段は偏ってもかまわないッてことですよね。(^_^;) 今後とも、よろしくお願いします。 ちなみに私の辞書は、Microsoft/Shogakukan Bookshelf Basic v2.0です。 簡略版だったため言葉が少なかったのだと思います。失礼(^_^;)

関連するQ&A

  • 規則に従った乱数

    一様乱数を発生させるプログラムはネット上でも入手できます。ある種の確率密度分布に従った乱数を発生させるにはどうしたらいいでしょうか。 例えば0から1の乱数ですが、平均が0.5で分散が0.2のガウス分布に従った乱数を発生させるとしたら0.5に近いところの値が多く出て、0.9のあたりはあまり出ないということになります。そういう乱数です。 そういうものを乱数というのかどうかわかりませんが。 しかし、物理現象は何らかの分布に従う乱数のようなものと考えることができるのではないでしょうか。 よろしくお願いします。

  • 発生させた乱数を用いての作業

    こんにちは 今回乱数発生で300個の乱数を作りました その乱数の二乗を新しいシートに出したいのですが、 単純にひとつの値をコピーして、それを二乗してオートフィル とやっても同じ値しか出てきません コピーする段階で、Sheet1のA1 のコピーという感じでできればいいのですが 単純に乱数の値しかコピーしてくれません。 どうすればできるのでしょうか? どうか教えてください

  • 発生乱数の偏りを無くしたい

    エクセルで=RAND()を用いてA1~A100のセルに100個乱数を発生させたときに(乱数は0~1の幅)、0~1の値を偏り無く発生させることは可能でしょうか?? 発生した100個の乱数をコピーして形式を“値”にして貼り付けてその100個の乱数の平均や中央値をみてみると0.5にはならないことから疑問に思いました・・・。 ご存知の方アドバイスよろしくお願いします。

  • java 乱数を並べて重複させない方法

    javaのプログラミングについて質問させてください。 まだ勉強し始めの初級者です。 1~25までの乱数を発生させ それらを重複させずに5列×5行に並べたいのですが、 Randomとfor文を使い乱数を発生させる事はできたのですが重複してしまいます。 ネットで調べたらArraylistのcontainsを使う等書いてあったのですが方法が分かりません。 5列×5行というのは ○、○、○、○、○、 ○、○、○、○、○、 ○、○、○、○、○、 ○、○、○、○、○、 ○、○、○、○、○、 という風に並べたいです。(○はすべて違う数字) どなたか分かる方ご教授よろしくお願いします。

    • ベストアンサー
    • Java
  • EXCEL 乱数発生の記録

    A1~C1 に0~9の乱数を発生[=RANDBETWEEN(0,9)]させ Dの列に再計算[F9を押す]の回数、E~Gの列に出た乱数の値を入れたいのですが、関数で可能でしょうか。   D E F G 1  1 2 5 7・・・1回目は 2,5,7が出た。 2  2 8 1 0・・・2回目は 8,1,0が出た。 3  3 9 4 4・・・3回目は 9,4,4が出た。 4  4 0 3 2・・・4回目は 0,3,2が出た。 このように再計算を行うと下の行に追加していきたいのですが、可能でしょうか。 宜しくお願いします。

  • ハッシュを使った擬似乱数

    予測不能な擬似乱数列を生成する際に、よく一方向ハッシュの性質を利用する 場合があります。一方向ハッシュの生成源として内部状態が与えられますが、 内部状態のbitサイズはどの程度にしたらよいでしょうか?   [種(カウンタの初期値)]        |        |        ↓ ┌→[内部状態(カウンタ)]―┬―→(一方向ハッシュ)――→擬似乱数列 |                 | |                 ↓ |               [1増加] |                 | └―――――――――――┘ ※ 暗号技術入門 秘密の国のアリス 結城 浩 著      ――第12章 乱数 Fig.12.5 より 極端な例として鍵(種)のサイズを32bit(C言語でunsigned long型)、値を0とします。 |0000 0000|0000 0000|0000 0000|0000 0000| 上記の値でハッシュ値を取ります。ハッシュアルゴリズムがSHA1の場合、 以下のような値が得られます(と思います)。 a = -1099956234 b = -343932961 c = -1287651379 d = -84150665 e = -1099170433 これらの値から鍵の値を得ることは困難なので、ハッシュ値によって生成された 擬似乱数は予測不能であるといえます。また、鍵の値を1だけ加算させて次の擬似乱数 を生成します。一般的にこのようにして乱数列は生成されます。 上記の例では32bitのとり得る値は0~4294967295です。鍵の値を一つずつ試し ていけば、それほど時間をかけることなく乱数の予測不能性は破られてしまいます。 ここで鍵の値を256bitとしました。 |0000 0000|0000 0000|0000 0000|0000 0000| |0000 0000|0000 0000|0000 0000|0000 0000| |0000 0000|0000 0000|0000 0000|0000 0000| |0000 0000|0000 0000|0000 0000|0000 0000| |0000 0000|0000 0000|0000 0000|0000 0000| |0000 0000|0000 0000|0000 0000|0000 0000| |0000 0000|0000 0000|0000 0000|0000 0000| |0000 0000|0000 0000|0000 0000|0000 0000| しかしこれだと1加算しただけではビット全体に対して変化が少なすぎます。 |0000 0000|0000 0000|0000 0000|0000 0000| |0000 0000|0000 0000|0000 0000|0000 0000| |0000 0000|0000 0000|0000 0000|0000 0000| |0000 0000|0000 0000|0000 0000|0000 0000| |0000 0000|0000 0000|0000 0000|0000 0000| |0000 0000|0000 0000|0000 0000|0000 0000| |0000 0000|0000 0000|0000 0000|0000 0000| |0000 0000|0000 0000|0000 0000|0000 0001|← 2005年に中国の大学の研究チームによってSHA1の弱衝突耐性が破られてしまいました。 現段階ではSHA1に変わる新しいアルゴリズムは発見されていません。(SHA2が作られましたが、 これはSHA1のbit数を拡張しただけで基本設計は変わっていません)なのでハッシュ値を 生成させる値もなるべく変化に富んだ値を与えることが推奨されています。 まとめると、   ・鍵(種)を総当り攻撃されないようにbit数を大きくしなけらばならない。   ・bit数を大きくすると1加算したときに変化が小さすぎる。   ・最初の図の手法は同記の文献に書いてあったもので、なるべく変えたくない。    (実際に使われる手法はある程度保障されているから) の制約があります。なので”bit数をどの程度にしたら適当か???”というのが質問です。 また、これらの問題を打開する方法もあればよいのですが、、、

  • PN9の乱数による無線機変調について

    PN9の乱数データによる変調時の無線機の占有帯域幅の計測について、C言語にてPN9の乱数の生成は可能になり0から511までの9ビットの生成はできました。 しかし、この次に無線機の転送データ(変調用データ)としては、一連の8ビットの乱数として与えなければなりません。 生成出来た9ビットの0から511のデータから8ビットの乱数のデータを取り出す手法が分かりません。 もしかすれば、確認した9ビットデータはハードロジックでいう9個のシフトレジスタの並列出力値に相当するのですが、PN9のデータとは一つのシフトレジスタのみから出力される1ビットのシリアルデータとしての値であり、512x9ビット=4608 の一連のビット列を示すのでしょうか? そうであれば、8ビット単位のデータを取り込むには、単に4608のビット列から先頭から順次8ビット区切りで取り出すことでいいのでしょうか? 回答、又はヒントを頂ければありがたいです。

  • 三角分布に従う乱数

    三角分布に従う乱数を発生させるプログラム 最頻値gで、0.8g~2.5gの範囲の三角分布(当然面積は1です)に従う乱数を発生させるプログラムを 書きたいと思っています。 この三角分布の確率密度関数をP(x)とすると、三角分布であるので最頻値gの左側である、傾きが正の直線h(x)と 最頻値gの右側である、傾きが負の直線f(x)で表せますよね 分布に従う乱数を発生させるためには、これら直線の関数を積分したものの逆関数x=P^-1(u) (Pのインバースです) (uは区間[0, 1]の一様乱数)とすればいいというところまでわかったんですが、 とりあえずh(x)とf(x)をそれぞれ積分して逆関数H^-1(u)、F^-1(u)を求めたところまではいいんですが x=H^-1(u)+F^-1(u)としてプログラムを実行すると、最頻値gの2倍あたりの値(例えば20に対して39など) しか出ず、最頻値gより小さい値が出ません。 H^-1(u)+F^-1(u)としているのがダメだと思うのですが、逆関数が2つある場合、ここからどうすればいいですか? また、初歩的な質問なのですが、区間[0, 1]の一様乱数というのはどう記述すればよいですか? ぜひ多くの方の回答お待ちしています。 よろしくお願いします。 (最頻値gは入力で与えるものとします)

  • 線形合同法(乗算型)による乱数発生法

    javaを使って乱数を発生するプログラムを作っています。 線形合同法(乗算型)に基づいて発生させようと思うのですが、疑問点があり質問しました。 乱数発生の漸化式 X(i+1)= a*X(i) (mod M) で、a,M,そして乱数の初期値を決めたいのですが、ネットを使って調べたところ、 a=16807 M=2147483647 が良いという記述がありました。 しかし、これをプログラムに反映させるとintの範囲から出てしまうため、検出値にマイナスが入ってしまいます。 また乱数の初期値に関する記述が見つからなかったので、どのような値にすべきか悩んでいます。 また、検出値をある範囲に(例えば100000まで)にしたい場合は、M=100000にすればいいと思うのですが、その場合のaや初期値の値はどのように決定したらよいのでしょうか? 教えて下さい。よろしくお願いします。

    • ベストアンサー
    • Java
  • 一様乱数?疑似乱数?

    0.0以上~1.0未満の範囲のdouble型一様乱数rdmを1000個発生させて、ヒストグラムをつくりたいのですが、このような書き方で良いのか、ご教示願えませんでしょうか。 ヒストグラムと言っても、グラフではなく、区間0≤u<0.1、0.1≤u<0.2、…、0.9≤u<1.0の10区間とし、配列aaに格納しているだけです。 また、「Math.random」を用いるやり方は理解できるのですが、下記のような書き方はいまいち納得できません。 疑問点1つ目、前者は毎回発生する乱数が違うのに、後者は同じですよね?なぜでしょうか。後者は毎回決まった値が出るので、初期値(seed)から決まった計算をしているということでしょうか。 疑問点2つ目、//kokoの次の行に x = rdm.nextDouble(); のように発生させた乱数を一時的に入れておかなくてもよいのでしょうか。 import java.util.*; public class test { public static void main(String [] args) { int aa [] = new int [10]; long seed = 999L; Random rdm = new Random(); rdm.setSeed(seed); for(int i = 0; i < 1000; i++){ for(int j=1; j<=10; j++){//koko if(rdm.nextDouble() < ((j-1)*0.1) && rdm.nextDouble() >= (j*0.1)) aa[j-1] = aa[j-1] + 1; } } for(int i=0; i<10; i++){ System.out.println( aa[i] ); } } }

    • ベストアンサー
    • Java