LTspiceの乱数は本当にランダムなのか?

2025年11月19日

Figure 1

   

要約

LTspice®」によるシミュレーションでは、いくつかの方法で乱数を使用できます。具体的には、flat()gauss()mc()の各関数を使用する方法が挙げられます。これらを使用すれば、擬似乱数(疑似的なランダム性を備える)と真の乱数(真のランダム性を備える)を生成可能です。また、これらの関数と共に「Use theclock to reseed the MC generator」というオプションを使用することもできます。本稿では、上に挙げた3つの関数のうちmc()関数の使い方を詳しく紹介することにします。その上で、擬似乱数と真の乱数のトレードオフについて説明します。更に、モンテカルロ手法のような統計的なシミュレーションと、最も厳しい条件に対象を絞ったシミュレーションのトレードオフについて解説を加えます。

はじめに

LTspiceでは、作成した回路図をベースとしてシミュレーションを実行します。その際には、いくつかの方法によってシミュレーションにランダム性を盛り込むことができます。具体的には、flat()gauss()mc()の各関数を使用することが可能です。特にmc()関数を使用すれば、受動部品の公差に注目したシミュレーションを容易に実施できます。本稿では、このmc()関数について詳しく解説することにします。なお、flat()関数とgauss()関数の詳細についてはLTspiceのマニュアルを参照してください。同マニュアルは、LTspiceを起動し、「Help」→「LTspice Help」を選択する(または「F1」キーを押す)ことで表示されます。

mc()関数の詳細

まず、図1の例をご覧ください。この例では、抵抗R1とコンデンサC1の公称値と公差について検証するためにmc()関数を使用しています。R1に注目すると、公称値は10kΩ、公差は5%に設定されていることがわかります。mc(x,y)と記述した場合、x * (1 -y)からx * (1 + y)の間で一様に分布する擬似乱数が生成されます。なお、擬似乱数と真の乱数の違いについては、後ほど説明します。また、LTspiceで真の乱数を生成する方法についても後述します。再び図1をご覧ください。.stepディレクティブでは、シミュレーションを反復して実行する回数を指定しています。図1の例の場合、同ディレクティブによりダミーのパラメータ(後述するstepに相当)が1から100まで1ずつ増加していきます。その結果、R1とC1の値をランダムに変化させつつ100回のシミュレーションが実行されます。

図1. RC回路の例。mc()関数を使用して受動部品の値と公差を設定しています。
図1. RC回路の例。mc()関数を使用して受動部品の値と公差を設定しています。

では、各回のシミュレーションが実行される際、mc()関数は具体的に何を行っているのでしょうか。図2に示したのは、それについて詳しく確認するための例です。ご覧のように、電圧源だけを使用した非常に簡素なものとなっています。mc()関数では、電圧源の公称電圧を10V、公差を100%に設定しています。つまり、0Vと20Vの間で出力電圧が均一に分布することを期待しているということです。ここで、LTspiceの波形ビューワとSPICEの出力ログに注目してください。これらを見ると、反復の回数(ログ中のstepに対応)が10回という条件では、電圧が2.7Vから19.92Vまでしか変化していないことがわかります。また、均一な分布が得られていないことにも注目してください。この例では10回しか反復していませんが、その回数を更に増やすことで、統計的な面でより適切な結果を得ることが可能になります。

更に詳しく分析するために、この10回の反復を伴うシミュレーション全体を何度か実行してみてください。実行するたびに異なる数値が生成されているでしょうか。筆者のPC上で実行した場合、実行するたびに各ステップで同じ電圧(ログ中の各stepに対応する値)が得られます。つまり、完全にランダムな値が生成されるわけではないことがわかります。

図2. 電圧源の例。mc()関数を使用して出力電圧をランダムに変化させます。
図2. 電圧源の例。mc()関数を使用して出力電圧をランダムに変化させます。

ただ、上記の結果はコンピュータとコードを使用して乱数を生成する場合の典型的な例だと言えます。多くのプログラミング言語では、乱数を生成する機能を使用できるようになっています。その機能には、オプションとしてseed()というメソッドが用意されていることが多いはずです。真の乱数を得るには、プログラムを実行するたびに同メソッドを呼び出してシードの値が変化するようにする必要があります。多くのプログラマは、実行時におけるシステムの時刻の値を同メソッドに引き渡すことによってランダム性を実現しています。

では、LTspiceのシミュレーションを実行するたびに真のランダム性が得られるようにすることが目的である場合にはどうすればよいのでしょうか。つまり、シミュレーションを実行するたびに値をランダムに変化させたいということです。その場合には、「Settings」パネルの「Hacks」タブに用意されている「Use theclock to reseed the MC generator」というオプションを有効にします(図3)。

図3.「Hacks」タブの設定。実行するたびにランダムな値を得るためには「Use the clock to reseed the MC generator」を有効にします。
図3.「Hacks」タブの設定。実行するたびにランダムな値を得るためには「Use the clock to reseed the MC generator」を有効にします。

このオプションは「時刻の値を使用してMC生成器を再シードする」というものです。このオプションを有効にした状態で、図2のようなmc()関数を使用するシミュレーションを実行すれば、真のランダム性が得られます。また、このオプションはflat()関数やgauss()関数にも同じように適用できます。これらの関数は、mc()関数を使用するのと同じ目的で使用することが可能です。

とはいえ、個々のシミュレーションにおいて本当に実現したいことは、真のランダム性を得ることなのでしょうか。これについては個々の状況に応じてよく考えてみる必要があります。シミュレーションを真にランダムなものにした場合、シミュレーションの予測可能性や再現性が失われることになるからです。

ここで図2の例に戻ります。シミュレーションの実行時に0Vと20Vの間で均一に分布する電圧を得たい場合にはどうするのが最適なのか改めて考えてみましょう。図2の状態では目的を完全に達成することはできていません。しかし、反復回数を10から100に増やせば求めている状態に大きく近づきます(図4)。このように調整を行うことで、望んでいるものに非常に近い分布が得られます。

図4. mc()関数を使用するシミュレーションの反復回数を増やした結果
図4. mc()関数を使用するシミュレーションの反復回数を増やした結果

ここまでで、2つのことが明らかになりました。1つは、mc()関数を使って100回にわたりシミュレーションを反復実行すると、値の分布がかなり良好になるということです。もう1つは、「Usethe clock to reseed the MC generator」というオプションを有効にしない場合、シミュレーションを実行するたびに同じ結果が繰り返し得られるということです。

では、mc()関数を回路内の複数の個所で使用した場合、どのような結果が得られるのでしょう。また、100回にわたって反復実行すれば、ランダムに生成される値がすべての公差のコーナー値に達することが保証されるのでしょうか。図5に、これら2つの疑問について検討するための例を示しました。この例では、mc()関数を適用した2つの電圧源を使用しています。シミュレーションの実行結果としては、X軸をV(out2)に設定してV(out1)の値をプロットすることにしました。ここで、X軸の軸名上で右クリックすれば、ダミーのパラメータ(stepの値)からV(out2)にX軸を変更できます。図5のプロットを見れば、V1とV2の組み合わせによって、かなりランダムな座標値が得られていることがわかります。但し、両電圧がいずれも同時に最小値になったり、同時に最大値になったりはしていません。したがって、厳密に言えばコーナー条件のカバー率が不足していることになります。

図5. 1つのシミュレーションで2つのmc()関数を使用した例。X軸をV(out2)に設定してV(out1)の値をプロットしました。
図5. 1つのシミュレーションで2つのmc()関数を使用した例。X軸をV(out2)に設定してV(out1)の値をプロットしました。

では、完全なカバー率に近づけることを目的とする場合にはどうすればよいのでしょうか。その場合、ステップの反復回数を増やす必要があります。すると、図6のような結果が得られます。

図6. 反復回数を増やした場合の結果
図6. 反復回数を増やした場合の結果

図6のような単純な例であれば、シミュレーション結果を短時間で得ることができるでしょう。実際、このシミュレーションであれば1000回実行しても問題はありません。しかし、1回のシミュレーションの実行に長い時間がかかる場合については大きな懸念があります。反復回数を増やすと、シミュレーションの結果が出るまでに数時間から数日かかるケースもあるはずです。また、「Use the clock to reseed the MC generator」を使用することの有効性についても検討しなければなりません。シミュレーションを実行する際、mc()関数によって値を生成することが適切だと判断されたとします。その場合、実行するたびに得られる結果を再現可能なものにすることが望ましいのでしょうか。それとも、シミュレーションを実行するたびにランダムに結果が変化するべきなのでしょうか。これは、「Use the clock to reseed the MC generator」の設定を有効にする前に検討しておくべき重要な問題です。

最後に、シミュレーション時間を大幅に短縮するためにランダム性を下げる手法について検討してみましょう。

図7に示したのがその例です。この例では、全シミュレーションにかかる時間を最小限に抑えつつ、シミュレーションの条件が受動部品の公差のコーナー値を必ず網羅するようにしています。具体的には、抵抗R1の3つの値(最小値、公称値、最大値)とコンデンサC1の3つの値を変更しながら、計9回のシミュレーションを実行しています。このようにすれば、各部品の値が同時に最小値(または最大値)になる場合を確実に網羅することができます。

図7. シミュレーション時間を大幅に短縮する方法。各部品の値が同時に最小値(または最大値)になる場合を確実に網羅することができます。
図7. シミュレーション時間を大幅に短縮する方法。各部品の値が同時に最小値(または最大値)になる場合を確実に網羅することができます。

まとめ

最後の例で示したように、コーナー条件に注目して回路の動作を検討することが目的である場合、ランダム性を下げた手法が最も理にかなっている可能性があります。一方、広い変動範囲の全体にわたり回路がどのように動作するのかを統計的に解析したいケースもあるでしょう。その場合、ランダム性を得るための関数を導入し、シミュレーションの反復回数を増やす手法が最適であるかもしれません。いずれにせよ、本稿で説明した内容により、LTspiceのシミュレーションにランダム性を組み込む(または組み込まない)方法についての理解が深まったのではないでしょうか。

本稿の内容に関連したものとして、「LTspiceを使用し、複雑な回路を対象とする統計的な公差解析用のモデルを構築する」もぜひご一読ください。

著者について

Anne Mahaffey
Anne Mahaffeyは、アナログ・デバイセズのプロダクト・アプリケーション担当プリンシパル・エンジニアです。LTspiceのサポートを担当しています。2003年に、ダイレクト・デジタル・シンセシス製品を担当するテスト技術者として入社。その後、10年以上にわたってツール・スイート「Precision Studio」に含まれる設計ツールの開発とサポートに携わっていました。ジョージア工科大学で電気工学の学士号、ノースカロライナ州立大学で電気...
myAnalogに追加

myAnalog のリソース セクション、既存のプロジェクト、または新しいプロジェクトに記事を追加します。

新規プロジェクトを作成

この記事に関して

資料


技術記事
設計ツール
最新メディア 21
Title
Subtitle
さらに詳しく
myAnalogに追加

myAnalog のリソース セクション、既存のプロジェクト、または新しいプロジェクトに記事を追加します。

新規プロジェクトを作成