matlabユーザーコミュニティー

matlab&si金宝appmulinkユーザーコミュニティー向けブログブログブログ

[6 3 7 8 5 1 2 4 9 10] – ”乱数”にまつわるストーリー

※このこのはは2022年6月7日日ににMike Croucher) に投稿されものの抄訳です。

3月下旬、 MATLAB の乱数処理についてTom Rhys Marshall さんが何か気が付いたようです。

randpermはランダム整数を关数で,例えばrandperm(10)1から10までまでの整数をランダム顺番返し。。新たににに立ち上げ立ち上げたたたたででででするとこのこの「「ランダムランダムランダム
randperm(10)
ans = 1×10
6 3 7 8 5 1 2 4 9 10
Tom さんなどが指摘されているように、世の中には、「そらそうでしょう」という人と「まじか・・知らなかった」と心配している人に分かれる様です。

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

MATLAB や Python、R における乱数は、純粋な意味での乱数ではなく完全に決定論的です。ただ、これらの「疑似乱数」アルゴリズムが返す数値は、デザイン上本当の乱数と同じ統計量を持っているので、注意さえしいればモンテカルロ・シミュレーションなどを、すべてが本当にランダムであるかのように考えることができます。
大事なな一度言います。。最近のプログラミング言語やシミュレーション・プラットフォームで使われているすべての「乱数」ジェネレータは、完全に決定論的です。もし、乱数を使って何かしようとしているなら、遅かれ早かれぶつかるポイントですね。
長い間、MATLAB の乱数生成器はMersenne Twisterと呼ばれるアルゴリズムをデフォルトとして使用してきました。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
「よりランダム」な数字を得るためにはシードに何か凝ったことをしないといけない・・と思われるかもしれませんが、単純な乱数の使い方であれば、どんな整数でも大丈夫です(既定でとは异なる発生器を使用する(((((),

A design choice: MATLAB 立ち上げ時のシードはなにであるべきか?

Tom さんのツイートへの返信を見ると、他の言語では MATLAB とは違う動作をすることが指摘されています。例えば、Python のデフォルトのジェネレータは、起動するたびに(おそらく)異なる乱数を返すとか。これは MATLAB よりもランダムというわけではなく、シードを設定する方法が異なるからです。
起動時のシード設定方法として、システム時刻を利用する方法があります。起動時の時刻を利用して整数を生成し、これをシードとして利用します。そうするとシステムを起動するたびに、異なるシード、つまり異なる乱数が作られます。MATLAB でもRNG(“洗牌”)を使えばできます。
rng(“shuffle”)% Use the system clock to set the seed
randperm(10)
ans = 1×10
7 4 5 6 1 3 9 2 10 8
twitterでも多くがそうして通り,,この方法が起动起动时时にに常に常に常に同じ同じシードシードを使用使用するする方法方法(ののののののデフォルト设定设定设定设定设定设定设定设定设定设定设定设定设定
  • よりランダムである(確かに毎回違う。これは役に立つかもしれないし、立たないかもしれない)
  • 2回実行「独立したことができることができることができることができる(たぶんたぶんにはこのこのこの方法で作らたたたたたたつのつのつのつのが统计的にに独立独立とでしょう)
過去のある時点で MathWorks では、もろもろの懸念事項よりも「再現性を重視する」設計上の決定がなされました。乱数生成器のシードにシステムクロックを使用することは(実際に使用されたシードを記録できず)再現性には嬉しくありません。もし必要であればRNG(“洗牌”)を使えばいい。

Bug report: 「乱数」が違う・・

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

My story: 時刻をシードにすることが必ずしも良いアイデアではない理由

その,乱数处理について知る前こと。マンチェスター大学の集団集団ののの一员一员だっだっだっ,,,,,,,,,,,,,というというというというという技术をを使ってて大学大学大学のののすべてすべての5000のの约のの,,ピーク时にコア利用可能なかなり大规模规模ものものでした。。そのそのユーザーユーザーをを
そんな時ある研究者が完璧なアプリケーションを持って接触してきました。それは MATLAB ではない何かでプログラムされたモンテカルロ・シミュレーションで、彼は週末に数十年分の CPU 時間分の計算を実行しました。彼はその結果にとても満足していました。結果を吟味し始めるまでは・・。
PCではでは通りを実行するたびに异なるががられいいましましたたた。。ただただ私たちのの作っ作ったたシステムシステムでは,,,同じ同じ同じ结果结果が何度度度出出出出出出もあれば个ことも,,よう见えますます。当时のの私たちは乱数の仕组仕组みみがががよく
私たちが使っていたコンピュータのシステムクロックは、インターネットを使って同期していました。結果として、多くの(全てではありませんが)ジョブは全く同じ時刻に起動し、全く同じシード、つまり同じ乱数ストリームを持つことになりました。
このブログので,「最近のプログラミング言語やシミュレーション・プラットフォームで使われている『乱数』発生器はすべて完全に決定論的である」「乱数を使って何かしようとしているなら、遅かれ早かれぶつかるポイントですね」と书きたが私がぶつかっ时の経験です。

もっと深掘りするは

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

|

注释

To leave a comment, please click这里to sign in to your MathWorks Account or create a new one.