Matlabユザコミュニティ

MATLAB & Simulinkユザコミュニティ向け日本語ブログ

[6 3 7 8 5 1 2 4 9 10]—“乱数”にま

※この投稿は2022年6月7日にMATLAB博客(迈克裘槎)に投稿されたものの抄訳です。

3月下旬,MATLABの乱数処理について汤姆里斯•马歇尔さんが何か気が付いたようです。

randpermはランダムな整数を返す関数で,例えばrandperm (10)は1から10までのすべての整数をランダムな順番で返します。新たに立上げたmatlabで実行するとこの"ランダムな"順番は常に同じです。
randperm (10)
ans = 1×10
6 3 7 8 5 1 2 4 9 10
汤姆さんなどが指摘されているように,世の中には,“そらそうでしょう”という人と”まじか・・知らなかった”と心配している人に分かれる様です。

コンピュタの作る乱数はランダムではない··

MATLABやPython, Rにおける乱数は,純粋な意味での乱数ではなく完全に決定論的です。ただ,これらの“疑似乱数”アルゴリズムが返す数値は,デザイン上本当の乱数と同じ統計量を持っているので,注意さえしていればモンテカルロ·シミュレションなどを,すべてが本当にランダムであるかのように考えることができます。
大事なことなのでもう一度言いますよ。最近のプログラミング言語やシミュレーション・プラットフォームで使われているすべての“乱数”ジェネレータは,完全に決定論的です。もし,乱数を使って何かしようとしているなら,遅かれ早かれぶ。
長い間,matlabの乱数生成器は梅森素数捻线机と呼ばれるアルゴリズムをデフォルトとして使用してきました。MathWorksのこの実装は、他の多くの実装と同様に、設定された「シード」に応じて異なる乱数セットを出力します。シードは整数で、rng ()関数を使用して設定できますが,MATLABを起動したときはデフォルトでシードは0に設定されています。
rng (0)
randperm (10)
ans = 1×10
6 3 7 8 5 1 2 4 9 10
もろん違うシドを設定すれば結果も違います。
rng (1)
randperm (10)
ans = 1×10
3 6 5 7 4 8 9 1 10 2
”“よりランダムな数字を得るためにはシードに何か凝ったことをしないといけない・・と思われるかもしれませんが,単純な乱数の使い方であれば,どんな整数でも大丈夫です(既定でクラ邮箱アントとワ邮箱カ邮箱は異なる乱数発生器を使用するので,並列シミュレーションを扱う場合はややこしくなりますが・・詳細は最後まとめた関連ページを参照してください)。

一、设计选择:MATLAB立上げ時のシドはなにであるべきか?

汤姆さんのツイートへの返信を見ると,他の言語ではmatlabとは違う動作をすることが指摘されています。例えば,Pythonのデフォルトのジェネレータは,起動するたびに(おそらく)異なる乱数を返すとか。これはmatlabよりもランダムというわけではなく,シドを設定する方法が異なるからです。
起動時のシド設定方法として,システム時刻を利用する方法があります。起動時の時刻を利用して整数を生成し,これをシドとして利用します。そうするとシステムを起動するたびに,異なるシド,まり異なる乱数が作られます。Matlabでもrng(“洗牌”)を使えばできます。
rng (“洗牌”使用系统时钟设置种子
randperm (10)
ans = 1×10
7 4 5 6 1 3 9 2 10 8
Twitterでも多くの人がそう主張している通り,この方法の方が起動時に常に同じシードを使用する方法(MATLABのデフォルト設定)よりも優れているという議論も可能です。例えば··
  • よりランダムである(確かに毎回違う.これは役に立かもしれないし,立たないかもしれない)
  • 2回実行してそれぞれ“独立した”結果を得ることができる(たぶん。実際にはこの方法で作られた2つの配列が統計的に独立であるという数学的な保証はありませんが,おそらくうまくいくでしょう)
過去のある時点でMathWorksでは,もろもろの懸念事項よりも”再現性を重視する”設計上の決定がなされました。乱数生成器のシードにシステムクロックを使用することは(実際に使用されたシードを記録できず)再現性には嬉しくありません。もし必要であればrng(“洗牌”)を使えばいいので。

错误报告:"乱数"が違う··

2008年年にmatlabで使用するデフォルトのアルゴリズムが変更されることがありました。多くのユザがテストに失敗··多くのバグレポトが寄せられました。一部のユザは,アルゴリズムを正確に再現可能な乱数で検証していたので乱数の変更は大問題でした。もちろん,アルゴリズムやシードを調整することは可能でしたが,多くの人はデフォルトの設定を使っていますからね。
もちろん何百万人ものユーザーのことを考えると,デフォルトの動作の変更は軽々しくできることではありません。ただ,古い乱数アルゴリズムに根本的な問題があったため,デフォルトの変更を余儀なくされました。梅森龙卷风はその問題を修正するために設計されました。2022年現在、Mersenne Twister は依然として多くの作業において優れた選択肢であり、MathWorks はユーザーが異なるものを必要とする場合に備えて、いくつかの追加アルゴリズムをオプションで追加しました。

我的故事:時刻をシドにすることが必ずしも良いアデアではない理由

その昔,コンピュ。マンチェスター大学のギーク集団の一員だった私は,秃鹫という技術を使って大学のすべてのデスクトップマシンをその場限りのスーパーコンピュータに変えていました。当時の基準では,ピク時に約5000のCPUコアが利用可能なかなり大規模なものでした。そのユザを探していました。
そんな時ある研究者が完璧なアプリケションを持って接触してきました。それはMATLABではない何かでプログラムされたモンテカルロ・シミュレーションで,彼は週末に数十年分のCPU時間分の計算を実行しました。彼はその結果にとても満足していました。結果を吟味し始めるまでは··。
デスクトップPCでは,予想通りシミュレションを実行するたびに異なる結果が得られていました。ただ,私たの作ったシステムでは,同じ結果が何度も出てきていました。同じ結果が数個出ることもあれば,数百個出ることもあり,パタ,ンもないように見えます。当時の私たは乱数の仕組みがよくわからなかったので大混乱。
私たが使っていたコンピュタのシステムクロックは,ネットを使って同期していました。結果として,多くの(全てではありませんが)ジョブは全く同じ時刻に起動し,全く同じシード,つまり同じ乱数ストリームを持つことになりました。
このブログの前半で,“最近のプログラミング言語やシミュレーション・プラットフォームで使われている“乱数”発生器はすべて完全に決定論的である”“乱数を使って何かしようとしているなら,遅かれ早かれぶつかるポイントですね”と書きました。これが私がぶかった時の経験です。

もっと深掘りするには

乱数は人気のあるトピックで,MATLABの公式ドキュメントはもちろんのこと,何年にもわたっていくつかのブログ記事があります。もっと深く掘り下げたい方にお勧めのものをいくかご紹介します。

|

评论

如欲留言,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。

Baidu
map