1. 程式人生 > >【演算法】輪盤賭法

【演算法】輪盤賭法

演算法描述

今天在看遺傳演算法時看到的一種選擇隨機運算元的演算法。通過產生大量隨機數往一個固定輪盤裡扔來實現概率選擇。

演算法實現原理

首先每次執行時呼叫隨機函式rand()/RAND_MAX,生成一個0-1之間的隨機數temp;
再判斷該隨機數究竟落到了哪一塊區域:
1.i=1時,如果temp<=sum (P[0]),則返回i,否則i++
2.i=k時,如果temp<=sum(P[0]+…+P[k]),則返回i,否則i++
……
3.當i=N時截止。

int RWS() {
    double m = 0;
    double r = (double)rand()/RAND_MAX; //r為0至1的隨機數
for (int i = 0; i < N; i++) { /** * 產生的隨機數在m~m+P[i]間則認為選中了i,因此i被選中的概率是P[i] */ m = m + P[i]; if (r <= m) return i; } }

測試程式碼

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<ctime>
#include<algorithm> #define INF 99999999 #define N 4//與P中數字個數相同 #define Time 1000//自定義執行次數 using namespace std; double P[]={0.1,0.2,0.3,0.4};//相加之和為1 int RWS() { double m = 0; double r = (double)rand()/RAND_MAX; //r為0至1的隨機數 for (int i = 0; i < N; i++) { /** * 產生的隨機數在m~m+P[i]間則認為選中了i,因此i被選中的概率是P[i] */
m = m + P[i]; if (r <= m) return i; } } int main(){ srand(time(0)); int a[5]; memset(a,0,sizeof(a)); for(int i=0;i<Time;i++){ int temp=RWS(); a[temp]++; } for(int i=0;i<N;i++){ double temp=a[i]*1.0/Time; printf("%.3lf ",temp); } return 0; }