計算機模擬的無法解決一個BUG,這是什麼理論?

【計算機模擬的無法解決一個BUG,請找兩面鏡子並站在鏡子間跳舞,理論上,這會引起死循環並導致整個世界的宕機】

初中生無法理解,這是什麼理論,這個說法正確嗎?

Ps:這個理論出現在一個天文學新聞評論區【人類是外星人模擬出來的】


這是一個既不懂物理也不懂計算機的二貨自己發明的理論。


任何一個合格的程序員在寫遞歸代碼時都一定會檢查結束條件。

然後再說多一點,即使真的出現了無限遞歸,那最終也是發生調用棧溢出,然後進程core dump而已。說什麼「導致整個世界的宕機」的,這傢伙的操作系統,不會還停留在dos1.0那水平吧?


鏡子A顯示的是鏡子B里的景象,而鏡子B里又有鏡子A的景象,於是對鏡A來說,它需要顯示一個包含它自身的鏡子的像,而這個像(鏡B)里又包含了一個包含這個像本身的鏡子A的像...無限遞歸下去,就得到:鏡子A包含一個像,這個像里的像包含了它自身,而這個包含它自身的像里的像又包含了它自身,而這個包含它自身的像里的像又包含了它自身......

就像這樣:

對於計算機模擬,如果沒有做限制,這樣無限遞歸下去就是一個死循環,永遠到不了頭,到最後就會導致線程失去響應;但是只要加一個判斷:當遞歸到指定次數時就停止,就可以避免這個問題。

而且,現實世界也是有細節極限的,那就是普朗克長度,也就是說,忽略光子大小,現實中兩面相對的鏡子也不會是無限嵌套的,達到這個尺度就會無法繼續分辨下去,也就是說,某一次反射時的像不再包含它對面的鏡子,而只是一個單純的亮點,於是遞歸就停止了。如果考慮光子大小,那麼停止的時刻遠在達到這個尺度之前,因為光子比普朗克長度大太多了,或者說後者太小了...


這個算不算

你沒法用個1t的硬碟模擬出一個1t的硬碟來……


虛像,是肉眼的錯覺,並不是物理上真是存在的實體,其本質是光線的反射。(海市蜃樓是光的折射,也是虛像),所有虛像用一個計算實體本體表徵就可以。

由於平行雙鏡系統所有虛像的視角都是平行的,在計算機中可用一個實體表示所有的虛像就夠用了,計算機在渲染畫面時,先渲染實體本身,任何一個虛像都可通過實體、鏡面、視口之間空間關係,計算虛像的景深,複製縮放而得。

至於虛像數量的優化,怎樣優化遠景與背景,就怎樣優化平行鏡面的無限虛像,這與裸眼觀察的視覺效果是一致的,近景大,遠景小,直至模糊、忽略。

計算雙鏡反射系統的虛像數量的公式是:

360度除以鏡面的夾角,減一。

120度夾角的雙鏡有2個虛像:

90度夾角是3個:

0度夾角就是無限多個了,儘管下圖只畫出了4個:

在雙平行鏡面系統中,光線在兩個物理鏡面之間不停地反射反射再反射,直到在經過某段距離的反射之後,以某個剛剛好的角度射入觀察者的眼中,人的大腦會把進去人眼的光線反向延伸一個同樣的距離,認為被觀察的實體就在這個空間點上,其實這個實體只是一個虛像。

以不同反射角度射入觀察者視野的光,傳播的距離是不同的,大腦會把他們當做不同景深的虛像來對待,從第一個虛像開始,由近及遠,沿著鏡子背面的方向,按照折射次數和折射路徑的長度,依次排列無窮多個虛像,直至宇宙的盡頭。(3d,5d,7d,9d.......每個虛像間隔2個鏡面的距離)

平行雙鏡中,物體的虛像在觀察者眼中的面積變化如下圖所示:

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?

TAG:學習 | 計算機 | 物理學 | 維度 |