計算機模擬的無法解決一個BUG,這是什麼理論?
【計算機模擬的無法解決一個BUG,請找兩面鏡子並站在鏡子間跳舞,理論上,這會引起死循環並導致整個世界的宕機】
初中生無法理解,這是什麼理論,這個說法正確嗎?Ps:這個理論出現在一個天文學新聞評論區【人類是外星人模擬出來的】
這是一個既不懂物理也不懂計算機的二貨自己發明的理論。
任何一個合格的程序員在寫遞歸代碼時都一定會檢查結束條件。
然後再說多一點,即使真的出現了無限遞歸,那最終也是發生調用棧溢出,然後進程core dump而已。說什麼「導致整個世界的宕機」的,這傢伙的操作系統,不會還停留在dos1.0那水平吧?
鏡子A顯示的是鏡子B里的景象,而鏡子B里又有鏡子A的景象,於是對鏡A來說,它需要顯示一個包含它自身的鏡子的像,而這個像(鏡B)里又包含了一個包含這個像本身的鏡子A的像...無限遞歸下去,就得到:鏡子A包含一個像,這個像里的像包含了它自身,而這個包含它自身的像里的像又包含了它自身,而這個包含它自身的像里的像又包含了它自身......
就像這樣:
對於計算機模擬,如果沒有做限制,這樣無限遞歸下去就是一個死循環,永遠到不了頭,到最後就會導致線程失去響應;但是只要加一個判斷:當遞歸到指定次數時就停止,就可以避免這個問題。
而且,現實世界也是有細節極限的,那就是普朗克長度,也就是說,忽略光子大小,現實中兩面相對的鏡子也不會是無限嵌套的,達到這個尺度就會無法繼續分辨下去,也就是說,某一次反射時的像不再包含它對面的鏡子,而只是一個單純的亮點,於是遞歸就停止了。如果考慮光子大小,那麼停止的時刻遠在達到這個尺度之前,因為光子比普朗克長度大太多了,或者說後者太小了...這個算不算你沒法用個1t的硬碟模擬出一個1t的硬碟來……
虛像,是肉眼的錯覺,並不是物理上真是存在的實體,其本質是光線的反射。(海市蜃樓是光的折射,也是虛像),所有虛像用一個計算實體本體表徵就可以。
由於平行雙鏡系統所有虛像的視角都是平行的,在計算機中可用一個實體表示所有的虛像就夠用了,計算機在渲染畫面時,先渲染實體本身,任何一個虛像都可通過實體、鏡面、視口之間空間關係,計算虛像的景深,複製縮放而得。
至於虛像數量的優化,怎樣優化遠景與背景,就怎樣優化平行鏡面的無限虛像,這與裸眼觀察的視覺效果是一致的,近景大,遠景小,直至模糊、忽略。
計算雙鏡反射系統的虛像數量的公式是:
360度除以鏡面的夾角,減一。120度夾角的雙鏡有2個虛像:
90度夾角是3個:
0度夾角就是無限多個了,儘管下圖只畫出了4個:
平行雙鏡中,物體的虛像在觀察者眼中的面積變化如下圖所示:
y是高度,x是距離(景深),圓型剖面就是不同虛像在不同景深下,人眼觀察到的面積, 是不是像一把小號,衰減的很快的,優化也就變得簡單了。
總結:景深優化、鏡像優化這根本不是個bug。機智的程序猿早就想到了辦法,叫做lazy programming。
不過專業性挺強的,涉及到函數範式編程思想,手機碼字中,什麼時候有電腦再上乾貨。
簡單地說,就是在計算機中,不僅一個數值可以是值,函數也是一個值。 Functions are values!
題主說的那個模擬,我所需要的只是兩個東西,一個叫做初始條件,一個叫做演算步驟。那麼我其實就已經儲存了這個遞歸的所有信息了。舉例,斐波納契數列,我實質需要的是:
fib(x) = 0 (x=0)
= 1 (x=1)= fib(x-1) + fib(x-2)
好了。但是在一般的程序,也就是eager的程序里,每一個東西都是演算成值再傳的。這個時候大家很明確地可以看到,如果我試圖去傳一整個數列,因為數列是無窮的,他就死循環了。
但是另一個思路,也就是lazy,簡單地說就是不到最後輸出不去演算。比如fib(x)這個函數,我把它作為一個整體的值去傳,本身是無損的,也不會死循環,直到最後用的時候才一遍算完。
當然了,如果最後輸出的時候還是要算到無窮。。。那麼只能說根本沒有辦法寫出這樣的程序。不過就模擬來說自然界沒什麼東西需要模擬到無窮,量子力學告訴我們自然界也是離散的。算到量子就不用算下去了,所以不構成問題。不正確。
1、模擬我們的計算機不一定是我們的這種計算機,你只能說「我們用的計算機不能模擬我們的世界」,且不說這麼說對不對,但是這已經是另外一個問題了
2、即便是模擬,也可以這樣模擬,模擬一束光在兩個鏡子間來回反射,但是隨著散射的發生,光越來越弱,弱到世界上的任何儀器檢測不到的時候,或著達到普朗克單位的時候,分無可分,消失
3、如果不消失怎麼辦,鏡子很理想,光的強度不減少怎麼辦?也沒關係,有同學擔心棧溢出,其實這種情況下根本不需要一個有固定底部的棧,棧的存在是為了返回,為了保存上下文,為了將來能退回去,光線的反射不需要後退,建立一個新的棧執行即可,棧超長了,抹掉底部,繼續增長。因此,可以不棧溢出。
我好像想到了劉慈欣的《鏡子》……超弦機模擬應該能行吧,不過那台機子好像也stackoverflow過。
我想告訴你一個讓你很失望的答案,現在的計算機就能很容易的解決這個問題:逐像素的光線追蹤,計算複雜度只和像素的多少有關
你沒玩過 Portal 可能
不正確,每次反射的圖像要被原來的圖像小,當圖像小於一個像素就沒必要計算下去了。所以不會造成無限循環導致死機
就像這樣
struct A{
int id; struct B mirror;};struct B {
int id; struct A mirror;};內存耗盡。就是模擬光子在兩個鏡子間以光速來回反彈,能有什麼bug……
你的問題有兩個來歷。
把光傳播的時間計算進去即可,下一刻的事就留給下一刻,想一次性窮盡才是個問題。現在物理引擎很多時候是騙爸爸的數學引擎(孤立對每個現象建模),而最終取決於程序員對現實的提煉。
現實世界是均勻連續的,故而事實上確實是無窮的,但現實世界的每個物質都同時是計算器和被計算者,換言之計算力和計算量是一致的。而用計算機去運算則是不可能徹底模仿物理的。
故而,提煉是難免的,合理提煉才有出路,被抽象掉的部分在提煉得合理時是沒有價值的。你想這麼玩兒也可以,兩台電腦a,b a遠程登錄控制b,然後在a登錄的b上遠程登錄控制啊,你就可以看到宕機的出現了
你玩過一個遊戲叫傳送門嗎?
這個bug的問題在假設了光速是無限的,因此同一個時間內生成了無限多的鏡像。然而,現實中光速是有限的,因此計算機中可以跟蹤每個光子運行即可。 如果不好理解的話,想像一個撞球桌子,它就像一個二維世界,世界就是一塊板子,鏡子是桌子邊,兩個相對的桌子邊平行,球就是光子,它在兩個相對的桌子邊垂直運動,來回彈,就是題主說的情況,然而這並不會導致計算機當機,因為撞球速度是有限的
這個題目就默認世界是連續的,而計算機處理的方式是不連續的,所以沒法模擬。但是光子也是有大小的,那種兩個鏡子反射次數也不是無限的,個人認為其實是可以模擬的。
推薦閱讀:
※catia,ansys,fluent電腦需求?
※假設一台量子計算機可以模擬自大爆炸開始的宇宙,那麼這台電腦能模擬出(預測)未來嗎?(詳見描述)?
※國家軟考的高級項目管理師證書有啥用?據說公司在申請大項目時需要有這樣的資質,聽說還可以掛靠什麼單位,有高人了解嗎
※ThinkPad X61 現在還能 DIY 配置嗎?
※zoule?