【演算法】輪盤賭法
阿新 • • 發佈:2019-01-30
演算法描述
今天在看遺傳演算法時看到的一種選擇隨機運算元的演算法。通過產生大量隨機數往一個固定輪盤裡扔來實現概率選擇。
演算法實現原理
首先每次執行時呼叫隨機函式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;
}