本帖最后由 rolaka 于 2010-5-4 17:26 编辑
一日 sxd叫儿子去超市打酱油 结账时候拿到一张抽奖卷 到柜台抽奖
柜台前的广告是这么写的:
- 50%拿到 餐巾纸 塑料袋 橡皮筋 中的随机一样
- 12%拿到 糖果 饼干 中的随机一样
- 5%拿到 优惠卷
- 1%拿到 猫粮
- 剩下就是谢谢惠顾了
现需要用au3 来模拟出这个抽奖箱 算法以执行10W次最后统计出来的结果准确度来衡量
(检验方法 算出10W次的结果->统计各类各项奖品在总抽奖次数里的比)
要求:
1.物品列表是可以修改的
2.单次执行时间控制在200ms以内
3.越短越好...!
初级题了...我蛋疼我自重...其实我写的代码太多...想看看有没有更加短的...
200ms的含义:生成一次结果所花费时间...
引起公愤了啊......下面是我自己的...#include <Array.au3>
$data = StringSplit(StringReplace(FileRead("list.txt"), @CR, ""), @LF, 2)
Dim $list[1][1]
For $i = 0 To UBound($data)-1
$spilt = StringSplit($data[$i], ",", 2)
$flag = False
For $n = 0 To UBound($list)-1
If $list[$n][0] == Int($spilt[0]) Then
$flag = True
ExitLoop
EndIf
Next
If $flag Then
$list[$n][1] = $list[$n][1] & "," & $spilt[1]
Else
ReDim $list[$n+1][2]
$list[$n][0] = Int($spilt[0])
$list[$n][1] = $spilt[1]
EndIf
Next
_ArrayDisplay($list)
$time = TimerInit()
$r = luckyBox($list)
MsgBox(0, TimerDiff($time), $r)
;~ For $i = 0 To 100000
;~ FileWriteLine("test",luckyBox($list))
;~ Next
;$list
Func luckyBox(ByRef $list)
$rate = Floor(Random(0, 99999, 1)/1000)
$weighting = 0
While 1
For $i = 1 To UBound($list)-1
If ($rate+$weighting) == $list[$i][0] Then
Return $list[$i][1]
EndIf
Next
$weighting += 1
WEnd
EndFunc
list.txt12,糖果
50,餐巾纸
50,塑料袋
50,橡皮筋
12,饼干
5,优惠卷
1,猫粮
100,谢谢惠顾
测试下来 基本在比例上把(有浮动是很正常的 像p版说的情况是允许少量出现的)... 测试10w次是为了看值的稳定性...
单次平均0.40ms左右... |