MATLAB rand隨機性控制

2021-09-12 18:36:19 字數 2387 閱讀 9998

**:

總結:rand產生的隨機數通過其狀態來控制

控制方法:

舊版:rand(『state』,x) %state是狀態,x是乙個整數,可自行設定

%sum(clock)簡單來說就是利用時間來做引數,以保證產生的隨機數不重複

新版:rng(x) %x為指定的狀態,為整數

%或者用』shuffle』

一.問題**

來自於乙份pso**,pso中需要初始化粒子位置和速度。

二.問題**

眾所周知,matlab中的rand()函式產生的是偽隨機數,但一般用來也可以接受。但是,如果我們知道偽隨機數的初始狀態,那麼產生的偽隨機數是唯一確定的。問題來了,matlab每次啟動會重置rand()和randn()的初始狀態(重置為0),也就是說,你產生的隨機數會出現兩次隨機數一模一樣的情況,如:

複製**

1 >> rand(『state』,0)

2 >> rand(3,1)

34 ans =

56 0.9501

7 0.2311

8 0.6068

910 >> rand(3,1)

1112 ans =

1314 0.4860

15 0.8913

16 0.7621

1718 >> rand(『state』,0)

19 >> rand(3,1)

2021 ans =

2223 0.9501

24 0.2311

25 0.6068

複製**

可以看到,第三次產生隨機數,因為初始狀態都是0,所以產生了完全一樣的隨機數!

設定初始狀態的好處是,只需要儲存那時的初始狀態再執行一遍程式你就可以重現之前的計算過程和結果。

缺點是雖然程式使用了隨機數,但由於(每次啟動後)初始狀態一樣,實際執行出來卻是相同的重複過程,你需要人工設定乙個保證隨機性的初始狀態。

三.問題分析

計算機系統中的隨機數都是偽隨機數,是通過乙個演算法連續產生的,知道上乙個隨機數,下乙個隨機數就確定,已知從給定的某個數開始,後面連續的隨機數序列都已經確定,我們使用隨機數就好像從這個序列中(也叫隨機數流)中取數字使用,為了增加隨機數的隨機程度,和可控性,用rand(『state』,x)來設定隨機數流的狀態,就像c語言中隨機數的seed,一旦給乙個x值,那麼後面的隨機數流就確定,為了增加隨機性,這裡用當前時間數碼sum(clock)作為隨機數的狀態,clock返回乙個6個元素的向量分辨是年月日時分秒,sum加起來就作為隨機數的狀態,因為你每次執行程式的時間不同,所以得到的隨機數序列就不同單獨使用這句時,改變了隨機數流的狀態,但是還沒有使用,所以不產生任何變數。但這個演算法有乙個問題是,如果計算機太快的話,仍然會生成相同隨機數。可考慮用 rand(『state』,sum(clock)*rand(1))。

四.問題解決

4.1 如何設定初始狀態12

3rand(『seed』, s)

rand(『state』, s)

rand(『twister』, s)

s是表示初始狀態的整數。

seed、state、twister就比較奇怪,令人捉摸不透,不知道該選用哪個。這實際上是產生隨機數的不同演算法。

seed表示採用v4版本的隨機數產生器,state是v5版本的隨機數產生器,最後的twister用的則是mersenne twister隨機數產生器。

此外,mathworks公司意識到了這幾個引數可能會產生誤導,於是在新版本(2012及以後)的matlab中更新了語法。12

345rng(1);

a = rand(2,2);

rng(『shuffle』)

a = rand(2,2);

新版的matlab預設採用mersenne twister隨機數產生器,rng(s) 函式表示設定初始狀態,rng(『shuffle』) 表示隨機分配乙個初始狀態。

所以現在只需要記住rng()函式設定初始狀態,然後用rand產生隨機數就可以了。

然而,有時我們只需要「真正」的偽隨機數(不重複!),如何得到?

4.2 產生非重複隨機數

用2012版本之後的使用者比較方便,在產生隨機數之前使用rng(『shuffle』)洗一下就可以(shuffle是洗牌的意思)。

對於舊版本的使用者,還不支援rng函式。以前一般是rand(『state』,sum(100*clock))來根據當前時間設定初始狀態,但時間始終是遞增的,而且變化幅度相對來說很小,效果不是很好。

有很多人用別的方式設定初始狀態(如rand(『twister』, fix(mod(1e11*(sum(clock)-2009), 231)));),為簡便起見,個人推薦採用新版matlab中rng函式語法,即rand(『twister』,mod(floor(now*8640000),231-1)) ,這樣可以產生的不同的隨機數。採用這種辦法大約每497天種子才會重複一次,一般使用的話足夠了

隨機性的控制

無論是平時的工作還是比賽,進行測試的時候一定要把隨機性控制住,使用seed everything的函式基本可以控制住常見的資料探勘過程中的隨機性了,如果涉及到tensorflow keras或pytorch,還需要針對器進行額外的隨機性控制。import os import random def s...

flash 與隨機性 隨機抽取

有時候做 程式的時候會經常希望隨機抽取乙個或者多個數,這時候問題就會因此而產生。在一些時間裡面,看了一些資料關於隨機性這個東西其實很有實用價值。不確定性,如隨機數,隨機移動等等。今天做了簡單的實驗,方法不唯一,也有很多更加完善的方法。但目前還是先把知道的記錄下來。題目一 怎樣隨機抽取乙個數?題目二 ...

flash 與隨機性 隨機抽取

有時候做 程式的時候會經常希望隨機抽取乙個或者多個數,這時候問題就會因此而產生。在一些時間裡面,看了一些資料關於隨機性這個東西其實很有實用價值。不確定性,如隨機數,隨機移動等等。今天做了簡單的實驗,方法不唯一,也有很多更加完善的方法。但目前還是先把知道的記錄下來。題目一 怎樣隨機抽取乙個數?題目二 ...