我的代碼有以下優點:
(1) A采用稀疏矩陣存儲,克服內存不足的問題(n為1百萬,使用的內存小於20M)。
(2)繪圖動態顯示N次模擬過程中r/R的變化。
代碼如下(已作為附件上傳):
n?=?1000000;
m?=?2 * N;
答?=?稀疏(M+1,?m+1);
j?=?n?+?1;
k?=?n?+?1;
b?=?ceil(4*rand(1,N));
%?圖中顯示了計算過程(為了提高效率,每N個循環輸出壹個點)
n?=?500;
v?=?零(1,fix(N/n)+1)?*?南;
h?=?劇情(1?:?fix(N/n)+1,?v,?b-',?楠,?楠,?ro’);
xlabel(' N ');
y label(' R/R ');
set(gcf,?' DoubleBuffer ',?上’);
set(gca,?Xlim ',?[1?fix(N/N)+1]);
t = ceil(exp(1:15));
set(gca,' xtick ',t/n,' xgrid ',' on ',' xticklabel ',t)
為了什麽?我?=?1:N
切換?b(壹)
案子?1,?j = j+1;?a(j,k)=a(j,k)+1;
案子?2,?k = k+1;?a(j,k)=a(j,k)+1;
案子?3,?j = j-1;?a(j,k)=a(j,k)+1;
案子?4,?k = k-1;?a(j,k)=a(j,k)+1;
結束
%?更新繪圖
如果?~rem(我,?n)?||?我?==?普通
%?註:不能用?sum(a(:)~=0)?算,否則容易導致內存不足。
r?=?full(sum(sum(a ~ = 0));
c?=?fix(log(I));
r?=?full(sum(sum(a = = c));
idx?=?修復(i/n)?+?1;
v(idx)?=?R/R;
set(h(1),?yData ',?五);
set(h(2),?' xData ',?idx,?yData ',?v(idx));
標題(['N?=?'?int 2 str(I)];
drawnow
結束
結束
%?輸出結果
fprintf('R=%i,r=%i,?r/R=%.3g\n\n ',?r,?r,?R/R);
%?計算各個方向的移動次數(驗證隨機數的壹致性)
為了什麽?我?=?1?:?四
Fprintf('方向%i的次數是%i\n ',?我,?sum(b = = I));
結束程序的輸出如下:
R=204146,?r=2856,?r/R=0.014
1方向的次數是249327。
方向2的次數是250179。
方向3的次數是250085。
方向4的次數是250409。
簡單說明幾點:
1,因為是隨機模擬,每次運行的結果都會不壹樣。
2.運動是壹個上下文相關的過程,所以隨機數序列不僅要均勻,還要獨立(相鄰隨機數之間沒有相關性)。
3.圖中虛線表示int(ln(n))變化時的n,計算網格數發生了變化,所以通常是不連續的。
4.從圖中的變化趨勢來看,並沒有明顯收斂到某個數字的跡象。我兩次運行的結果分別是0.0118和0.014。
5.在我的機器上,取n = 1萬,運行時間約為N=100分鐘。
6.該程序對MATLAB版本沒有特殊要求。已經在6.5,2008a,2012b上測試過,可以正常運行。