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


14

Microsoft ExcelのRANDBETWEEN関数を使用する必要があり、ワークシートのどこかで他の操作を行うたびに新しい乱数のセットが生成されることを認識しています。また、たとえばaとbの間のn個の乱数リストをソートするために生成された一連の乱数を「フリーズ」する回避策も知っています。私の質問はこれです:なぜ乱数が生成されるのですか?アルゴリズムにこれを必要とするものはありますか?FWIW、Google Sheets、LibreOffice Calc、Apple Numbersはすべて同じ動作を示します。


「なぜ...」に関する質問 おそらく著者だけが明確な答えを出すことができるので、ここではしばしば話題から外れています。質問に目的の機能が含まれていないため、何かを提案することは困難です。
マーテユハス

2
MátéJuhász@それは...それは難しいことではないことを考えると答えはショーらしい
太陽マイク

ここではない答えが、一を必要とする人のための回避策のカップルです:stackoverflow.com/questions/8011032/...
アダム

回答:


28

チャールズウィリアムズは、Excelが物事をどのように計算するのか、そしてその理由について十分に説明しています。

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

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

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

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

Excelの計算エンジンは、Excelが開発中の競合製品とは一線を画す「recalc or die」の哲学に基づいています。この記事をチェックしてください:https : //www.geekwire.com/2015/recalc-or-die-30-years-later-microsoft-excel-1-0-vets-recount-a-project-that-defied-the -odds /


3
もちろん、「揮発性関数」が正しく定義されていれば、速度を除いて、すべてを再計算することと必要なものだけを再計算することの間に目に見える違いはないはずです。
ホッブズ

12

他の答えは再計算のメカニズムと揮発性関数の役割に焦点を当てていますが、私はそれが問題の要旨の一部を見逃していると思います。これは、採用されているルールに対応していますが、「理由」にはあまり対応していません。それに焦点を当てます。

デザインのコンセプト

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

関数自体には、再計算するかどうかを選択するロジックは含まれていません。すべてのExcel関数の性質は、トリガーされるたびに何らかのタイプの操作を実行することです。関数には、現在の値の独自の「メモリ」や過去の計算の履歴はありません。仕事をするように頼まれているのはこれが初めてかどうかを知る方法はありません。したがって、ネイティブ関数には一度だけ実行する機能はありません。いずれかの関数が再計算された場合、その関数は設計どおりに機能し、新しい値を生成します。

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

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

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

関数ロジック

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

再計算時に関数の値が変化するかどうかは、その目的とその根拠に依存します。定数値の計算では、常に同じ結果が生成されます。変更されていないセル値に基づく操作でも同じ結果が得られます。

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

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

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

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


この詳細な説明は、私が求めている答えに近づきつつも、納得できません。1〜365の25個の乱数を生成しようとしています。これを20回行う必要があります(はい、「古典的な」誕生日問題のシミュレーションです)。25個の乱数のセットを生成したら、(1)他の25個のセットを生成し、(2)生成したばかりの20個のセットをソートできるように、それらをフリーズしたいです。私はここで他の人が提案した回避策を使用してこれを行うことができますが、これは基本統計を勉強している多くの学生に伝わるのは非常に面倒です。
nowradioguy

3
@nowradioguy、あなたが納得していない部分は何ですか?Excelは特定の方法で機能しますが、その機能とデザインにこだわっています。必要に応じて、結果を保存するのは非常に簡単で、何回も実行する必要があります。数値が列にある場合は、25のセットを1つのステップで選択してコピーし、特別な値を別の場所のセルに貼り付けます。数回クリックするだけで、おそらく最速の方法です。貼り付けはおそらく再計算をトリガーするので、繰り返す準備ができています。数分で20セットを実行できます。それからそれを楽しんでください。:-)
fixer1234

2

ワークシートを変更すると、すべての数式の自動再計算が開始されます。これはデフォルトの動作です。

無効にするか、純粋な値に変換して実際の値をフリーズすることができます(式の反対)。


1
私はそれを理解していますが、なぜあなたは知っているのでしょうか?特定のセルで生成された乱数が、そのワークシートの他の場所で実行された操作の影響を受ける理由については明らかなことは何もありません。
nowradioguy

3
「生涯」ランダムな値が必要な場合、または頻繁に変更したい場合、Excelは事前にどのように知ることができますか?2番目のケースのほうがより可能性が高くなります(反対のケースのように、セルに直接ランダムな値を入力できます)。
MarianD

あなたの声明は間違っています。自動再計算では、すべての数式が再計算されるわけではありません。ブックに揮発性関数がある場合のみ。
テイリン

1

これは「揮発性」式として分類され、変更が検出されたとき、または新しい関数が入力されたときに再計算される関数のリストの一部です。

考慮すべきもう1つのオプションは、シートを手動計算に切り替えて、発生するタイミングを制御することです。値または数式を変更しても再計算は行われないため、再計算を忘れないようにしてください。


私はグーグルの「揮発性式」を試しましたが、wghatが「揮発性」式のリストにあることを説明する多くのリンクが出てきましたが、どこでRANDBETWEENが揮発性の式であるのか、そうでなければならないのかについての説明はどこにもありません。
nowradioguy

1
それは「ランダム」であるため、毎回再計算するのが論理的であると仮定します...指摘したように、乱数を修正したい場合は、2つの異なる方法があります。ここではいくつかの良い情報:decisionmodels.com/calcsecretsi.htm
太陽マイク

はい、ありがとうございます; それは、Google検索で出た結果の1つでしたが、私の質問に直接対処するものではありません。考えてみてください。別のセルで無関係な操作を行っていて、計算が続いた場合、以前に生成された乱数は新たに生成されて変更されます。私にはほとんど意味がありません。
nowradioguy

イベントがそのプロセスをトリガーすると、Excelはセル値を再計算し、randbetweenは揮発性として分類されます(娘のためにダイスシートを作成したため、F9を押すたびに再計算されます...)ので、再計算されます。volatile-functions-excel。以前に乱数を変えたくない場合は、それを達成するための2つの方法があります。
ソーラーマイク

@ fixer1234 NOT EVERYTHINGは揮発性です。スプレッドシートで何かが変更されたときに、すべての数式が再評価されるわけではありません。これは、ブックに揮発性の数式が含まれている場合にのみ発生します。Sum()またはCountif()などが存在する場合、変更されたセルのみが再計算され、ワー​​クブックは再計算されません。
テイリン

0

この音をバグではなく機能のように見せるための英雄的な努力にもかかわらず、私はこの動作が日常的に有利であるとは考えにくいと思います。「機能」は私たちの生活を楽にし、「バグ」はそれを難し​​くします。私の場合、他のセルから参照されていないセルにラベルまたは説明を入力すると、再ランダム化が処理に不便になります。これを「バグ」と呼びます。

はい、手動で再計算を制御する(痛み)か、値を貼り付けてそれを防ぐことができます(もう一度、痛み)が、どのような場合に、シートの遠隔領域にテキストを入力することによって引き起こされる再ランダム化によって生活が楽になりますか?

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

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


スーパーユーザーへようこそ。このサイトはソリューションのナレッジベースであるため、回答の投稿は質問で尋ねられた内容に対する回答に焦点を合わせる必要があります。ほとんどすべての投稿は、サイトのフレームワーク内で非生産的であるため、実際に暴言、意見、およびコメントです。あなたの最後の段落は有望かもしれません。他のすべてを削除することを検討し、最後の段落を展開して、「方法」をさらに含めるようにしてください。Excel初心者の場合、そのツールパックをロードする方法について言及することも役立ちます。
fixer1234
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.