你的算法和我不同,不过答案接近,好像都有道理,挺有意思。 你的胜负判定是取两个上限不同的随机数,较大的那个赢。譬如[0,100]与[0,80]各取一个随机数,前一个比后一个大的几率,即胜率是20%+80%/2=60% 我的胜负判定是在一个区间划成两份取随机数,落在那一份算该份赢。譬如把[0,100]以60为界划分,那么随机数落在第一份的几率是60%。 依我的算法,第一题我的实力为100,A=100×30/70,B=100×10/90,A vs B:A/(A+B)=79.41% 依你的算法,第一题A~[0,20],B~[0,60],A vs B:(60-20)/60+20/(60*2)=5/6=83.33% 我的算法第二题C=100×60/40,D=100×40/60,C vs D:C/(C+D)=69.23% 你的算法第二题C~[0,125],D~[0,80],C vs D:(125-80+40)/125=68%
就是我描述的算法,在区间去随机数,然后比较大小。 function CaluRate1(rnd1, rnd2: Integer; times: Int64): Single; var r1, r2: Single; rw1, i: integer; begin RandSeed := DateTimeToFileDate(Now); Randomize; rw1 := 0; for i := 1 to times do begin r1 := random(rnd1)+1; r2 := random(rnd2)+1; if r1 > r2 then inc(rw1); end; Result := rw1 / times; end;