由於我的算法中的參數初始值是在一定范圍內隨機給的,老板說要多跑幾次計算結果的均值和方差以減小隨機性帶來的影響,我跑了十遍發現結果怎么都一樣,原來是rand出了問題。
1. MATLAB中的rand產生的是0到1(不包括1)的隨機數,rand函數生成的是偽隨機數,是由種子遞推出來的,相同的種子,生成相同的隨機數。
2. MATLAB剛運行起來的時候,種子都為初始值,所以每次重啟MATLAB的時候,Rand的狀態都被重置(相當於把序列的指針移到了隨機數序列的開始),因此每次第一次執行rand得到的隨機數都是相同的。
實驗:打開MATLAB,用rand(1)跑一下。關掉MATLAB再打開一次,再用rand(1)跑一下。結果確實是一樣的。
一般來說有兩種需求:
(1)多次運行,生成相同隨機數
演示需求,比如示例程序,希望每一個跑這段程序的人都能和示例得到一樣的結果,那么就需要大家的rand產生的值是一樣的。
方法:
用rand('state',s)設定種子,s為35階向量,最簡單的設為0就好。
例:rand('state',0); rand(1);
(2)多次運行,生成不同隨機數
比如像我這樣子跑實驗,希望盡可能是產生的隨機數,不希望每次重啟MATLAB都是一樣的。
方法:
用rand('state',sum(100*clock))產生和時間相關的種子,種子與計算機當前的時鍾時間有關,如果計算機的時間相同,生成的隨機數還是會相同。
在你計算機速度足夠快的情況下,試運行一下:
rand('state',sum(100*clock));A=rand(5,5);rand('state',sum(100*clock));B=rand(5,5);
A和B是相同.
所以還可以再增加一個隨機變量,變成:
rand('state',sum(100*clock)*rand(1));