Excel RANDBETWEEN の数値がワークシート上の操作によって変更されるのはなぜですか?

Excel RANDBETWEEN の数値がワークシート上の操作によって変更されるのはなぜですか?

Microsoft Excel の RANDBETWEEN 関数を使用する必要があり、ワークシートのどこかで何か他の操作を行うたびに、新しい乱数セットが生成されることを認識しています。また、たとえば、a と b の間の乱数 n リストを並べ替えるために生成された乱数セットを「固定」する回避策も認識しています。私の質問は、生成された乱数が変化する理由です。アルゴリズムにこれを必要とする何かがあるのでしょうか。参考までに、Google Sheets、LibreOffice Calc、Apple Numbers はすべて同じ動作を示します。

答え1

Charles Williams は、Excel がどのように計算を行うのか、またその理由をわかりやすく説明しています。

http://www.decisionmodels.com/calcsecretsi.htm

本質的には、ワークブックに揮発性関数が含まれている場合 (揮発性関数は Excel のバージョンによって長年にわたって変更されているため、Charles のリストを参照してください)、ワークブック内のいずれかのセルが変更されると、ワークブック全体の再計算がトリガーされます (Excel が自動計算に設定されている場合)。ワークブックに揮発性関数がない場合、最後の変更によって影響を受けるセルのみが再計算されます。

ここで他の人が述べているように、自動計算では、セルが変更されると常にブック内のすべてのものが計算されますが、これは誤りです。揮発性関数のみがブック内のすべてのセルの自動再計算を引き起こします。揮発性関数がない場合、Excel は再計算が必要なものだけを再計算します。

そのため、違いを知っている私のような人間は、可能であればワークシート セルで OFFSET() や INDIRECT() などの揮発性関数を避けることを強くお勧めします。これらの関数を使用すると、セルが変更されるたびに完全な再計算が発生し、ワークブックの速度が低下するからです。OFFSET() の代わりに INDEX() を使用することを習得すると、速度が大幅に向上する可能性があります。これは、Index が揮発性ではないためです (詳細については Charles の記事を参照してください)。

Excel の計算エンジンは、「再計算しなければ死ぬ」という哲学に基づいており、開発当時、Excel は競合製品と一線を画していました。こちらの記事をご覧ください。https://www.geekwire.com/2015/recalc-or-die-30-years-later-microsoft-excel-1-0-vets-recount-a-project-that-defied-the-odds/

答え2

他の回答では、再計算の仕組みと揮発性関数の役割に焦点を当てていますが、質問の要点の一部が抜けていると思います。採用されているルールについては触れていますが、「なぜ」については触れていません。私はそれに焦点を当てます。

デザインのコンセプト

まず、ほとんどの最新のスプレッドシートの設計コンセプトと構成要素から始めましょう。そこには「責任の分担」があります。関数は特定のタスクを実行する専用のルーチンであり、要求されるたびにそのタスクを実行します。それとは別に、スプレッドシート アプリケーションは関数が要求されるタイミングを制御します。

関数自体には、再計算するかしないかを選択するロジックは含まれていません。すべての Excel 関数の性質は、トリガーされるといつでも何らかの操作を実行することです。関数には、現在の値や過去の計算の履歴に関する独自の「メモリ」はありません。関数には、これが初めてその処理を要求されたかどうかを知る方法がありません。したがって、ネイティブ関数には、1 回だけ実行できる機能はありません。関数が再計算されると、その関数は設計どおりに動作し、新しい値を生成します。

スプレッドシートアプリケーションには、不必要な再計算をスキップして時間を節約できるインテリジェンスが含まれています(teylynの回答で説明されているように)。のみ再計算がスキップされるのは、再計算の必要性を引き起こしたスプレッドシートの変更によって関数の値が影響を受けなかったことをアプリケーションが認識している場合です。

では、関数を一度実行してその値を保持する必要がある場合はどうすればよいでしょうか。乱数を生成し、結果を変更しないという例を考えてみましょう。これはランダムに生成された定数を作成する方法であり、Excel で実行できます。

Excel は、ユーザーがその機能をどのように使用したいか、つまり、新しい値の生成を継続したいのか、それとも最後のセットを保持したいのかを知ることはできません。各オプションは、Excel がサポートするユース ケースです。Excel は、新しい値を計算するツールと古い値を保持するツールを提供することで、両方のケースに対応しています。ユーザーは好きなものを構築できます。ただし、ユーザーが望むように機能させる責任はユーザーにあります。

関数ロジック

それでは、関数が行うロジックを見てみましょう。ランダム関数の値はスプレッドシート内の他の変更によって影響を受けないため、再計算ロジックでランダム関数をスキップすることは理にかなっているでしょうか?

再計算時に関数の値が変化するかどうかは、関数の目的と計算の根拠によって異なります。定数値の計算では常に同じ結果が生成されます。変更されていないセル値に基づく演算でも同じ結果が生成されます。

ただし、一部の関数は、毎回異なる結果を生成することを意図して設計されています。たとえば、現在の時刻に基づく関数を考えてみましょう。これらの関数は、再計算時の時刻に基づいて新しい結果を生成します。現在の時刻に基づいて値を生成することを目的とした関数は、再計算時に更新されません。

再計算制御の目的は、再計算がトリガーされたときに常にすべてが現在の状態を反映するようにすることです。現在の時刻に基づく関数が更新されないと、この基準は満たされません。

RANDBETWEEN のような「ランダム」関数は、再計算時に新しい乱数を生成することを目的としています。それが、これらの関数の本来の目的です。スプレッドシートで発生する他の事象によって値が影響を受けないように、再計算をスキップできると主張することもできます。

これがデフォルトの動作であれば、スプレッドシートは更新されますが、ランダム値は一定のままです。これはあまりランダムな動作ではありません。これでは、1 つのユース ケースはサポートされますが、他のユース ケースはサポートされません。基本的な設計コンセプトに戻ると、これは他の関数と同じように処理されます。デフォルトの動作では、Excel が再計算します。ユース ケースで以前の値を保持したい場合は、利用可能なツールを使用してそれを行う必要があります。

答え3

ワークシートの変更ごとに自動再計算すべての数式に対して、これがデフォルトの動作です。

これを無効にしたり、実際の値を純粋な値に変換して固定したりすることができます (数式の反対として)。

答え4

これをバグではなく機能のように見せようとする勇敢な努力にもかかわらず、この動作が日常的に有利である可能性は極めて低いと思います。「機能」は私たちの生活を楽にし、「バグ」はそれを難し​​くします。私の場合、他のセルによって参照されていないセルにラベルまたは説明を入力すると、扱いにくい再ランダム化が発生します。私はそれを「バグ」と呼びます。

はい、再計算を手動で制御したり (面倒です)、値を貼り付けて再計算を防いだり (これも面倒です) できますが、シートの離れた領域にテキストを入力することで再ランダム化が行われると、どのような場合に作業が楽になるのでしょうか。

「揮発性」関数の処理に何らかのロジックがあるとしても、無関係で参照されていないセルにテキストを入力した後、または他の完全に無関係な編集によって「Enter」キーを押す以外の適切な基準によって再計算をトリガーするのは、非常に簡単であるように思われます。それを防ぐことがデフォルトであるべきであり、実装が難しいとは考えられません。誰かがその「機能」を望むなら、それをオンにすることができますが、それが良いこととなるのはいつなのか想像できません。せいぜい、比較的無害かもしれません。私にとっては、作成しているシートの種類が原因で、これは大きな面倒です。

最後に、分析ツールパックを使用すると、さまざまな方法で乱数の分布を作成できます。作成された数値の範囲は、再計算 (再ランダム化) するように指示しない限り、まったく再計算されません。そのため、ニーズに合う場合は分析ツールパックを使用することをお勧めします。

関連情報