diaryこの広告は、90日以上更新していないブログに表示しています。2017の18日目の記事です。普段私はRustを使ってシミュレータを作成しているのですが、そこでお世話になっているライブラリ(クレート)を簡単に紹介します。今回紹介するライブラリ(用途)は以下の2つです。(様々な確率分布に従う乱数生成)rayonすでにいくつかの記事で紹介されていますが、rayonによって主に以下の処理を簡潔に行うことができます。stealingと呼ばれる方法で実現されているそうです。Iteratorの導入によって通常のイテレータに対する関数(mapなど)の処理を並列化することができます。D言語でいうstd.parallelismに似ているかもしれません。Rustのシステムによって並列時の安全性は保証されています。標準ライブラリのスレッド同様、Sendトレイト、Syncトレイトの制約によってコンパイル時に検査が行われます。Iteratorに変換することができ、以下のような対応関係を持ちます。(所有権が移動したイテレータ)コード例は以下のとおりです。格納先のベクタをミュータブルとして宣言したのち、collect_into関数を用いて格納する必要があります。コード例は以下のとおりです。200未満の偶数がeven_vecに格納される}並列処理時のスレッド数は自動的に決定されますが、スレッド数を能動的に設定したい場合は、num_threads関数によって設定可能です。実行時にスレッド数を設定したい場合は、環境変数RAYON_NUM_THREADSの値を設定してから実行することで対応できます。再帰関数の分割処理join関数によって、再帰関数を効率的に並列処理します。rayonのGithubリポジトリの例が簡潔であるため、引用します。コード例は、並列化したクイックソートのようです。above).とのことですので、join関数の引数のクロージャを、可能なら並列処理し、CPUの負荷が高い場合は逐次的に処理するよう、うまくスケジューリングされる(?)ようです。statrsstatrsはRustにおける統計的な数値計算のためのクレートで、特に私はdistributionモジュールを頻繁に利用しています。distributionモジュールを利用することで、各種確率分布に従う乱数を容易に生成することができます。わず様々な分布に対応しており、以下の分布ごとに構造体が定義されています(非常に多い)。対しては確率密度関数の値を返す関数が実装されています。sample関数(rand::Rngトレイトを実装する乱数生成器を引数)の実装によって、各分布に従う乱数を生成可能です。本記事ではdistributionモジュールにのみ着目しましたが、他のモジュールにてベータ関数やエラー関数などの複雑な関数の値を計算する関数も用意されているようです。まとめrayonやstatrsは、数値シミュレーションをするうえで、大変有用です。並列処理により計算時間を削減することができ、randクレートでは対応していない様々な確率分布に従う乱数生成を行うことで様々なシミュレーションが可能です。Rustはコンパイラが大変優秀なので、コンパイル時の検査のおかげでシミュレーション実行時のエラーがなく、重宝しています。その一方で、コンパイルを通すのは大変ですが。私の身の回りでもRustが流行ればいいな、と思うこの頃です。月別アーカイブ参加グループプログラミングはてなブログをはじめよう!je6bmqさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。