輪盤技巧之概率算法?

設P(i),其中i=1..n,為n個個體被選擇的概率 ,在輪盤上表示為所佔扇區的面積百分比,這裡顯然sum(P)=1。select用來保管n次選擇的結果。

1)第一種完成方法:能夠想象一個轉動的輪盤,留意這裡輪盤最多隻轉一圈。每次轉輪盤前,把色子隨機放到輪盤外緣的某處,即色子不隨輪盤轉動,以一個隨機數sel代表它所處的位置。輪盤轉動後,色子所指示的輪盤扇區號不時變化,輪盤中止時色子所指示的輪盤上扇區號,即為本次輪盤賭所選中的個體號。

for i = 1:n %第i次擲色子

sel = rand; %產生一個0、1之間的隨機數,代表色子在輪盤外緣所指示的位置

sumPs = 0; %輪盤初始轉動的位置,從0變化到1

j = 1; %輪盤初始指示的位置

while sumPs

sumPs = sumPs + P(j) %輪盤轉動

j = j + 1; %輪盤指示位置

end

select(i) = j-1; %輪盤中止時色子停留位置所指示的個體

end %循環終了,會對輪盤上由P所劃分出來的n個區間產生n次隨機選擇,扇區越大,該扇區被選中的機率也越大

還需求留意的是:上面的程序中,我們當然能夠把n改成2*n或者10*n,產生的結果都是“個體概率 所表示扇區越大,該個體被選中的機率也越大”,並且隨著實驗次數的增大,這一結果越準確。

2)這種辦法能夠想象成往劃分好扇區的輪盤裡扔色子,事前生成一組滿足平均散佈的隨機數,代表n次擲色子或者n個色子一同扔,輪盤不動,色子所在區域為選擇結果。

r = rand(1,n) %預先產生n個色子的位置,留意這裡r服從0、1之間平均散佈

for i = 1:n %第i次輪盤賭

select(i) = n; %本次輪盤賭的結果初始化為n

for j = 1:n %輪盤開端轉動

if r(j) <=P(i) %若色子停在輪盤第j扇區

select(i) = j; %則第i次輪盤賭的結果為j

break; %第i次輪盤賭完畢

end %~第i次輪盤賭完畢

end %~第i次輪盤賭完畢

end %n次輪盤賭完畢

下面為完好的matlab程序完成

function Select=Roulette(P,num)

%:按輪盤賭戰略選擇下一點,返回num次輪盤賭結果

%:第一種輪盤賭辦法,精度很低,

% m = length(P);

% Select = zeros(1,num);

% for i=1:num

% Select(i) = m;% 初始化為最後一個

% for j=1:m %:按概率 選擇

% if P(j)>rand()

% Select(i)=j;

% break;

% end

% end

% end

%:第二種輪盤賭辦法,精度較高

m = length(P);

Select = zeros(1,num);

r = rand(1,num);

for i=1:num

sumP = 0;

j = ceil(m*rand); %產生1~m之間的隨機整數

while sumP < r(i)

sumP = sumP + P(mod(j-1,m)+1);

j = j+1;

end

%Select(i) = mod(j-1,m)+1-1;

Select(i) = mod(j-2,m)+1;

end

% 本程序中輪盤賭辦法的精確水平可由如下程序考證

% P=rand(10,1);

% P=P./sum(P);

% Select=Roulette(P,1e6);

% for i=1:10

% Ps(i)=(sum(Select==i)/1e6);

% end

%:最後考證該輪盤賭辦法精確水平

%:比擬P和Ps差別大小,例如sum((P-Ps).^2),數值越小,模仿結果越好!

相關問題答案