為什麼 Excel RANDBETWEEN 數字對於工作表上的任何操作都會改變?

為什麼 Excel RANDBETWEEN 數字對於工作表上的任何操作都會改變?

我需要使用 Microsoft Excel 的 RANDBETWEEN 函數,並且知道每當您在工作表上的任何位置執行任何其他操作時都會產生一組新的隨機數。我還知道「凍結」一組已產生的隨機數的解決方法,例如用於對 a 和 b 之間的 n 個隨機數字列表進行排序。我的問題是:為什麼產生的隨機數會改變?演算法中是否有某些東西需要這樣做? FWIW、Google Sheets、LibreOffice Calc、Apple Numbers 都表現出相同的行為。

答案1

Charles Williams 對 Excel 的計算方式及其原因有很好的解釋。

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

本質上,如果工作簿包含易失性函數(請參閱Charles 的列表,因為多年來不同的Excel 版本,易失性函數已經發生了變化),當工作簿中的任何單元格發生更改時,都會觸發整個工作簿重新計算(如果Excel設定為自動計算)。如果工作簿中沒有揮發性函數,則只有受上次變更影響的儲存格才會重新計算。

這裡的其他人指出,當任何單元格發生更改時,自動計算將始終計算工作簿中的所有內容,但這是錯誤的。只有易失性函數才會導致工作簿中所有儲存格的自動重新計算。如果沒有易失性函數,Excel 僅重新計算需要重新計算的內容。

這就是為什麼像我這樣知道其中區別的人強烈建議盡可能避免在工作表單元格中使用像OFFSET() 或INDIRECT() 這樣的易失性函數,因為乳清會在每次單元格更改後導致完全重新計算,從而減慢工作簿的速度。學習使用 INDEX() 而不是 OFFSET() 可以顯著提高速度,因為 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 函數的本質都是在觸發時執行某種類型的操作。沒有函數有自己的當前值的“記憶”,或過去計算的歷史記錄。它無法知道這是否是它第一次被要求完成其工作。因此,沒有一個本機函數只能運作一次。如果重新計算任何函數,它將執行其設計的操作並產生新的值。

電子表格應用程式確實包含一些智能,可以透過跳過不必要的重新計算來節省時間(如 teylyn 的答案中所述)。這僅有的如果應用程式知道函數的值不受觸發需要重新計算的電子表格變更的影響,則跳過重新計算的時間。

那麼,如果您需要讓函數運行一次然後保留其值怎麼辦?以產生隨機數字然後使結果不變的範例為例。這描述了創建隨機生成的常數,您可以使用 Excel 來做到這一點。

Excel 無法知道您想如何使用它的功能;是否要繼續產生新值或保留最後一組值。每個選項都是 Excel 支援的一個用例。 Excel 透過為您提供計算新值的工具和保留舊值的工具來適應這兩種情況。你可以建造任何你想要的東西。但用戶有責任讓它做他們想做的事。

函數邏輯

那麼讓我們來看看該函數的邏輯。重新計算邏輯跳過隨機函數是否有意義,因為它的值不應受到電子表格中其他變更的影響?

函數的值是否會在重新計算時變化取決於其目的和基於什麼。常數值的計算總是會產生相同的結果。基於未更改的單元格值的操作將產生相同的結果。

然而,有些函數的設計意圖和目的是每次都會產生不同的結果。例如,考慮基於當前時間的函數。他們將根據重新計算的時間產生新的結果。您不能擁有一個函數,其目的是根據當前時間產生一個值,並且在重新計算時不更新該值。

重新計算控制的目標是在重新計算被觸發時始終使一切反映事物的當前狀態。如果不更新基於當前時間的函數,則無法滿足該標準。

「隨機」函數(例如 RANDBETWEEN)的目的是在重新計算時產生新的隨機數。這就是他們的目的。您可能會爭辯說可以跳過重新計算,因為該值不應受到電子表格上發生的其他事情的影響。

如果這是預設行為,您將更新電子表格,但隨機值將保持不變。這不是非常隨機的行為。這將支援一種用例,但不支援另一種用例。回到基本的設計概念,它的處理方式與其他功能一樣。預設行為是讓 Excel 重新計算它。如果您想保留用例的先前值,則可以使用可用的工具來完成此操作。

答案3

工作表中的每次變更都會啟動自動重新計算所有公式的,這是預設行為。

您可以停用它或透過將其轉換為純值(與公式相反)來凍結實際值。

答案4

儘管我們付出了巨大的努力,讓這聽起來像是一個功能而不是一個錯誤,但我發現這種行為通常不太可能是有利的。 「功能」讓我們的生活更輕鬆,「錯誤」讓我們的生活變得更困難。就我而言,在未被任何其他單元格引用的單元格中輸入標籤或解釋會導致重新隨機化,這不方便處理。我稱之為「錯誤」。

是的,我可以手動控制重新計算(很痛苦),或者我可以貼上值來防止它(再次,很痛苦),但是在什麼情況下,在工作表的遠端區域中輸入文字導致的重新隨機化會讓生活變得更輕鬆?

即使處理“易失性”函數背後存在一些邏輯,透過適當的標準觸發重新計算似乎也很容易,而不是在不相關和未引用的單元格中輸入文本後簡單地按“回車”,或者通過其他完全不相關的編輯。防止這種情況應該是預設的,我無法想像它會很難實現。如果有人想要這個“功能”,那麼他們可以打開它,但我無法想像這什麼時候會是一件好事。充其量,它可能相對無害。對我來說,由於我創建的工作表類型,這是一個很大的麻煩。

最後——分析工具庫允許您以多種方式創建隨機數分佈,並且這樣創建的數字範圍根本不會重新計算(重新隨機化),除非您告訴它要這樣做。因此,我建議人們在滿足需求時使用分析工具庫。

相關內容