记录一个工作中遇到的小问题,奇数位是概率,偶数位是数值,给一个列表根据概率求数值。
%% 根据奇数位的概率随机求偶数位 列表如:[50,3,30,5,20,10]
getRand(WeightList) ->%% 求出奇数位总和WeightSum = sum_odd(WeightList),%% 求随机数RandNumber = rand:uniform(WeightSum),getRand(RandNumber,WeightList,none,none,false,1).
getRand(_,[],none,LastMax,_,_) -> LastMax;
getRand(_,[],LastMin,_,_,_) -> LastMin;
getRand(Number,[H|T],LastMin,LastMax,Find,Index) ->ifFind =:= true -> H; %% 找到了奇数位的范围,输出偶数位数值Index rem 2 =:= 1 -> %% 从奇数位里判断范围,随机数到底比谁小case Number > H oftrue -> getRand(Number,T,LastMin,LastMax,true,Index+1);false -> getRand(Number,T,LastMin,H,Find,Index+1)end;%% 跳过偶数位判断true-> getRand(Number,T,LastMin,LastMax,Find,Index+1)end.%% 求列表奇数位的总和
sum_odd([H|T])->sum_odd([H|T],1,0).
sum_odd([],_,Result) -> Result;
sum_odd([H|T],Index,Result) when Index rem 2 == 1 -> sum_odd(T,Index + 1,Result + H);
sum_odd([H|T],Index,Result) -> sum_odd(T,Index + 1,Result).