隨機數

rand(n):生成0到1之間的n階隨機數方陣 rand(m,n):生成0到1之間的m×n的隨機數矩陣 (現成的函數)
Matlab隨機數生成函數betarnd 貝塔分佈的隨機數生成器binornd 二項分佈的隨機數生成器chi2rnd 卡方分佈的隨機數生成器exprnd 指數分佈的隨機數生成器frnd f分佈的隨機數生成器gamrnd 伽瑪分佈的隨機數生成器geornd 幾何分佈的隨機數生成器hygernd 超幾何分佈的隨機數生成器lognrnd 對數正態分佈的隨機數生成器nbinrnd 負二項分佈的隨機數生成器ncfrnd 非中心f分佈的隨機數生成器nctrnd 非中心t分佈的隨機數生成器ncx2rnd 非中心卡方分佈的隨機數生成器normrnd 正態(高斯)分佈的隨機數生成器poissrnd 泊松分佈的隨機數生成器raylrnd 瑞利分佈的隨機數生成器trnd 學生氏t分佈的隨機數生成器unidrnd 離散均勻分佈的隨機數生成器unifrnd 連續均勻分佈的隨機數生成器weibrnd 威布爾分佈的隨機數生成器
matlab中rand這個函數能產生[0,1]之間的隨機數,但matlab的這個隨機性我似乎理解錯了。我打開matlab,輸入rand(3,3),產生一個結果;然後我把matlab整個關掉,再重新打開它,再次輸入rand(3,3),兩次輸出的結果居然一樣,實驗了n次都一樣。但是如果不關閉軟件直接輸入兩次rand(3,3),則出來不同的結果。這個隨機性到底是怎麼回事?注:我使用的matlab6.5
問題補充:有沒有真正的產生隨機數的辦法。
很顯然樓主對隨機數的生成並沒有概念, 一組真正的隨機數的生成的計算量已經遠大於一個一般的個人電腦所能承受的水平(也有生成幾個數的運算量較小的算法,不過生成個數受算法限制),二維隨機數則幾乎在On時間可返回隨機數,高效快速,樓主的問題是如何生成不同的隨機個體,那麼在程序前加如下一句話無疑最爲方便 rand('state',sum(100*clock)) 這樣就可以完成樓主所謂的隨機了。
matlab隨機函數rand使用中應注意的問題
rand產生的是0到1(不包括1)的隨機數.
matlab的rand函數生的是僞隨機數,即由種子遞推出來的,相同的種子,生成相同的隨機數.
matlab剛運行起來時,種子都爲初始值,因此每次第一次執行rand得到的隨機數都是相同的.
1.多次運行,生成相同的隨機數方法:
用rand('state',S)設定種子S爲35階向量,最簡單的設爲0就好
例:
rand('state',0);rand(10)
2. 任何生成相同的隨機數方法:
試着產生和時間相關的隨機數,種子與當前時間有關.
rand('state',sum(100*clock))
即:
rand('state',sum(100*clock)) ;rand(10)
只要執行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));
%
據說matlab 的rand 函數還存在其它的根本性的問題,似乎是非隨機性問題.
沒具體研究及討論,驗證過,不感多言.
       
C++中的意思
*轉:rand()的用法rand()不需要參數,它會返回一個從0到最大隨機數的任意整數,最大隨機數的大小通常是固定的一個大整數。 這樣,如果你要產生0~10的整數,可以表達爲:  int N = rand() % 11;這樣,N的值就是一個0~10的隨機數,如果要產生1~10,則是這樣:  int N = 1 + rand() % 10;  總結來說,可以表示爲:  a + rand() % n其中的a是起始值,n是整數的範圍。  a + rand() % (b-a+1) 就表示 a~b之間的一個隨機數若要0~1的小數,則可以先取得0~10的整數,然後均除以10即可得到隨機到十分位的10個隨機小數,若要得到隨機到百分位的隨機小數,則需要先得到0~100的10個整數,然後均除以100,其它情況依此類推。
// C++隨機函數(VC program)#include <stdio.h>#include <iostream>#include <time.h>using namespace std;#define MAX 100int main(int argc, char* argv[]){srand( (unsigned)time( NULL ) );//srand()函數產生一個以當前時間開始的隨機種子   for (int i=0;i<10;i++)   cout<<rand()%MAX<<endl;//MAX爲最大值,其隨機域爲0~MAX-1   return 0;}*
1、求助]關於randn 函數的一個問題
查了下資料
randn函數用於產生均值0。方差爲1的隨機序列
但是我輸入如下語言
y=randn(1,100)
顯示出來的隨機序列數字,怎麼有絕對值大於1的?
請哪位大蝦解釋下 ,大謝~

是啊 那位高手給指點下啊seed=[12345 54321];rand('state',seed(1));randn('state',seed(2));是什麼作用呢!
seed就是做一個隨機的種子,以這個種子爲起始點進行隨機,至於隨機的算法有很多,基本的一種是大數求餘法從種子這個層面上來說,隨機也不是很隨機
方差爲1,而不是絕對值。產生的這些隨機數的方差爲1
2、我想生成同一個序列,怎麼辦?是不是可以賦與一個seed之類的?
這樣的話,我先運行一遍程序關了,再重新運行生成的還是一樣嗎?能給一個簡單的演示程序嗎?先謝過了
用rand('state',S)設定種子S爲35階向量,最簡單的設爲0就好你試驗一下就知道了,是一樣的rand('state',0);rand(10)這條語句什麼時候執行輸出都一樣
給一個seed並不能讓輸出變成真正的random,seed只是改變了輸出序列的開始值。【 在 sjtuyh (net) 的大作中提到: 】: 我一般這樣做:: rand('state', sum(100*clock));: 由當前時間來確定初態。: 要不然你每次打開matlab, randn輸出的結果一樣。: 說白來了是pseudo-random.
設取值區間爲[a,b],則要在此區間選取一個隨機數,程序爲:a=rand()*(b-a)+a若要求隨機數是整數,則程序爲:a=ceil(rand()*(b-a))+a這樣即可!!!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章