怎么加快速度,求算法

BRBLM 2004-08-15 02:54:13
我想测一个东西的概率,这个东西如下:

六个骰子,每个只有四个面。
第一个是 0 1 2 3,
第二个是 0 4 5 6,
第三个是 0 7 8 9,
第四个是0 10 11 12 ,
第五个是 0 13 14 15 ,
第六个是 0 16 17 18。

六个骰子一起甩,结果相加。连甩三次,三次相加
一共189种可能,我想求这189种的概率

下面我原先写的

Dim a(6), Gl(189), Add, N, I, Ad, M
N = Val(Text2.Text)

For I = 1 To N
Ad = 0
For M = 1 To 3
Add = 0
Randomize
a(1) = Int(4 * Rnd)
Randomize
a(2) = Int(4 * Rnd + 4)
If a(2) = 7 Then a(2) = 0
Randomize
a(3) = Int(4 * Rnd + 7)
If a(3) = 10 Then a(3) = 0
Randomize
a(4) = Int(4 * Rnd + 10)
If a(4) = 13 Then a(4) = 0
Randomize
a(5) = Int(4 * Rnd + 13)
If a(5) = 16 Then a(5) = 0
Randomize
a(6) = Int(4 * Rnd + 16)
If a(6) = 19 Then a(6) = 0
Add = a(1) + a(2) + a(3) + a(4) + a(5) + a(6)
Ad = Ad + Add
Next M

Gl(Ad) = Gl(Ad) + 1
Next I
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
ReDim arrValues(1 To 189, 1 To 2) '定义动态数组
For I = 1 To 189 '给数组赋值
arrValues(I, 1) = " " & I
arrValues(I, 2) = Gl(I)
Next I
MSChart1.ChartData = arrValues '图表显示数据
MSChart1.Column = 1
MSChart1.ColumnLabel = "概率"



我为了试试能否加快速度我里面又一个循环的for我自己写了

Dim Gl(189), Add, N, I, Ad, M, a1(3), a2(3), a3(3), a4(6), a5(6), a6(6)
N = Val(Text2.Text)

For I = 1 To N
Ad = 0

Add = 0

Randomize
a1(1) = Int(4 * Rnd)
Randomize
a1(2) = Int(4 * Rnd)
Randomize
a1(3) = Int(4 * Rnd)

Randomize
a2(1) = Int(4 * Rnd + 4)
If a2(1) = 7 Then a2(1) = 0
Randomize
a2(2) = Int(4 * Rnd + 4)
If a2(2) = 7 Then a2(2) = 0
Randomize
a2(3) = Int(4 * Rnd + 4)
If a2(3) = 7 Then a2(3) = 0

Randomize
a3(1) = Int(4 * Rnd + 7)
If a3(1) = 10 Then a3(1) = 0
Randomize
a3(2) = Int(4 * Rnd + 7)
If a3(2) = 10 Then a3(2) = 0
Randomize
a3(3) = Int(4 * Rnd + 7)
If a3(3) = 10 Then a3(3) = 0

Randomize
a4(1) = Int(4 * Rnd + 10)
If a4(1) = 13 Then a4(1) = 0
Randomize
a4(2) = Int(4 * Rnd + 10)
If a4(2) = 13 Then a4(2) = 0
Randomize
a4(3) = Int(4 * Rnd + 10)
If a4(3) = 13 Then a4(3) = 0

Randomize
a5(1) = Int(4 * Rnd + 13)
If a5(1) = 16 Then a5(1) = 0
Randomize
a5(2) = Int(4 * Rnd + 13)
If a5(2) = 16 Then a5(2) = 0
Randomize
a5(3) = Int(4 * Rnd + 13)
If a5(3) = 16 Then a5(3) = 0

Randomize
a6(1) = Int(4 * Rnd + 16)
If a6(1) = 19 Then a6(1) = 0
Randomize
a6(2) = Int(4 * Rnd + 16)
If a6(2) = 19 Then a6(2) = 0
Randomize
a6(3) = Int(4 * Rnd + 16)
If a6(3) = 19 Then a6(3) = 0


Add = a1(1) + a1(2) + a1(3) + a2(1) + a2(2) + a2(3) + a3(1) + a3(2) + a3(3) + a4(1) + a4(2) + a4(3) + a5(1) + a5(2) + a5(3) + a6(1) + a6(2) + a6(3)
Ad = Ad + Add


Gl(Ad) = Gl(Ad) + 1
Next I
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
ReDim arrValues(1 To 189, 1 To 2) '定义动态数组
For I = 1 To 189 '给数组赋值
arrValues(I, 1) = " " & I
arrValues(I, 2) = Gl(I)
Next I
MSChart1.ChartData = arrValues '图表显示数据
MSChart1.Column = 1
MSChart1.ColumnLabel = "概率"







大家又什么好的办法能让这个算法更快吗?我想算1亿次的概率,但10000000万就会死掉

...全文
332 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
BRBLM 2004-08-16
  • 打赏
  • 举报
回复
190种可能

另外,每种可能的概率在甩前就已经决定了。算法不是太难,只是好象价值不止10分,呵呵

1000000次概率曲线还有明显浮动,我想10亿次才行

可是会死掉的~~~
KiteGirl 2004-08-16
  • 打赏
  • 举报
回复
瓶颈在RND函数。不改善随机数的取得方式,永远也无法加快。
northwolves 2004-08-16
  • 打赏
  • 举报
回复
接上:

101: 516212760/68719476736 = 0.007511884323321
102: 547391614/68719476736 = 0.007965596363647
103: 579448503/68719476736 = 0.008432085494860
104: 612321462/68719476736 = 0.008910450007534
105: 645945647/68719476736 = 0.009399746297277
106: 680247633/68719476736 = 0.009898905889713
107: 715137432/68719476736 = 0.010406619287096
108: 750505050/68719476736 = 0.010921285866061
109: 786221166/68719476736 = 0.011441023758380
110: 822135774/68719476736 = 0.011963650089456
111: 858072715/68719476736 = 0.012486601408455
112: 893828823/68719476736 = 0.013006921260967
113: 929191203/68719476736 = 0.013521511617000
114: 963975053/68719476736 = 0.014027683253516
115: 998063184/68719476736 = 0.014523730846122
116:1031416041/68719476736 = 0.015009078793810
117:1064033455/68719476736 = 0.015483724637306
118:1095882168/68719476736 = 0.015947184409015
119:1126831713/68719476736 = 0.016397559564211
120:1156640401/68719476736 = 0.016831333065056
121:1184999982/68719476736 = 0.017244019283680
122:1211606514/68719476736 = 0.017631195281865
123:1236208523/68719476736 = 0.017989201631281
124:1258604976/68719476736 = 0.018315112916753
125:1278607143/68719476736 = 0.018606182755320
126:1296006383/68719476736 = 0.018859375020838
127:1310582931/68719476736 = 0.019071491711657
128:1322156919/68719476736 = 0.019239915403887
129:1330650680/68719476736 = 0.019363515893929
130:1336124166/68719476736 = 0.019443165598204
131:1338762996/68719476736 = 0.019481565628666
132:1338822302/68719476736 = 0.019482428644551
133:1336542477/68719476736 = 0.019449252824416
134:1332055503/68719476736 = 0.019383958759136
135:1325304372/68719476736 = 0.019285716873128
136:1316007231/68719476736 = 0.019150425665430
137:1303699134/68719476736 = 0.018971319281263
138:1287860419/68719476736 = 0.018740835643257
139:1268093907/68719476736 = 0.018453195036273
140:1244273319/68719476736 = 0.018106559859007
141:1216589113/68719476736 = 0.017703701640130
142:1185474081/68719476736 = 0.017250918332138
143:1151464857/68719476736 = 0.016756018987508
144:1115091649/68719476736 = 0.016226719148108
145:1076856153/68719476736 = 0.015670319451601
146:1037279178/68719476736 = 0.015094398666406
147: 996936257/68719476736 = 0.014507331899949
148: 956403060/68719476736 = 0.013917496253271
149: 916102707/68719476736 = 0.013331048932741
150: 876131645/68719476736 = 0.012749393426930
151: 836176149/68719476736 = 0.012167964436230
152: 795591771/68719476736 = 0.011577384007978
153: 753631545/68719476736 = 0.010966782356263
154: 709732620/68719476736 = 0.010327968921047
155: 663747939/68719476736 = 0.009658803741331
156: 616042573/68719476736 = 0.008964599299361
157: 567434724/68719476736 = 0.008257262001280
158: 519016461/68719476736 = 0.007552683542599
159: 471921831/68719476736 = 0.006867366479128
160: 427117992/68719476736 = 0.006215384812094
161: 385279974/68719476736 = 0.005606561520835
162: 346772674/68719476736 = 0.005046206555562
163: 311713605/68719476736 = 0.004536029955489
164: 280050420/68719476736 = 0.004075269971509
165: 251587140/68719476736 = 0.003661074733827
166: 225941796/68719476736 = 0.003287885861937
167: 202488792/68719476736 = 0.002946599735878
168: 180379562/68719476736 = 0.002624868095154
169: 158705727/68719476736 = 0.002309472285560
170: 136778811/68719476736 = 0.001990393662709
171: 114407452/68719476736 = 0.001664847542997
172: 92024466/68719476736 = 0.001339132228168
173: 70578822/68719476736 = 0.001027057034662
174: 51225966/68719476736 = 0.000745435914723
175: 34950855/68719476736 = 0.000508601879119
176: 22282347/68719476736 = 0.000324250824633
177: 13198277/68719476736 = 0.000192060208065
178: 7221465/68719476736 = 0.000105086146505
179: 3627480/68719476736 = 0.000052786781453
180: 1661205/68719476736 = 0.000024173714337
181: 687837/68719476736 = 0.000010009345715
182: 254895/68719476736 = 0.000003709210432
183: 83442/68719476736 = 0.000001214240910
184: 23715/68719476736 = 0.000000345098670
185: 5712/68719476736 = 0.000000083120540
186: 1125/68719476736 = 0.000000016370905
187: 171/68719476736 = 0.000000002488378
188: 18/68719476736 = 0.000000000261934
189: 1/68719476736 = 0.000000000014552

northwolves 2004-08-16
  • 打赏
  • 举报
回复
返回:

概率如下:
0: 1/68719476736 = 0.000000000014552
1: 3/68719476736 = 0.000000000043656
2: 6/68719476736 = 0.000000000087311
3: 10/68719476736 = 0.000000000145519
4: 15/68719476736 = 0.000000000218279
5: 24/68719476736 = 0.000000000349246
6: 40/68719476736 = 0.000000000582077
7: 66/68719476736 = 0.000000000960426
8: 102/68719476736 = 0.000000001484295
9: 148/68719476736 = 0.000000002153683
10: 207/68719476736 = 0.000000003012246
11: 288/68719476736 = 0.000000004190952
12: 406/68719476736 = 0.000000005908078
13: 576/68719476736 = 0.000000008381903
14: 810/68719476736 = 0.000000011787051
15: 1115/68719476736 = 0.000000016225385
16: 1503/68719476736 = 0.000000021871529
17: 2001/68719476736 = 0.000000029118382
18: 2658/68719476736 = 0.000000038678991
19: 3534/68719476736 = 0.000000051426468
20: 4686/68719476736 = 0.000000068190275
21: 6160/68719476736 = 0.000000089639798
22: 8004/68719476736 = 0.000000116473529
23: 10302/68719476736 = 0.000000149913831
24: 13189/68719476736 = 0.000000191925210
25: 16845/68719476736 = 0.000000245127012
26: 21462/68719476736 = 0.000000312313205
27: 27229/68719476736 = 0.000000396234100
28: 34353/68719476736 = 0.000000499901944
29: 43107/68719476736 = 0.000000627289410
30: 53866/68719476736 = 0.000000783853466
31: 67089/68719476736 = 0.000000976273441
32: 83274/68719476736 = 0.000001211796189
33: 102929/68719476736 = 0.000001497814083
34: 126624/68719476736 = 0.000001842621714
35: 155094/68719476736 = 0.000002256914740
36: 189319/68719476736 = 0.000002754954039
37: 230496/68719476736 = 0.000003354158252
38: 279921/68719476736 = 0.000004073386663
39: 338902/68719476736 = 0.000004931673175
40: 408828/68719476736 = 0.000005949230399
41: 491403/68719476736 = 0.000007150854799
42: 588853/68719476736 = 0.000008568938938
43: 703926/68719476736 = 0.000010243471479
44: 839637/68719476736 = 0.000012218326447
45: 998994/68719476736 = 0.000014537276002
46: 1184997/68719476736 = 0.000017243975890
47: 1401006/68719476736 = 0.000020387320546
48: 1651246/68719476736 = 0.000024028791813
49: 1941039/68719476736 = 0.000028245834983
50: 2276592/68719476736 = 0.000033128773794
51: 2664536/68719476736 = 0.000038774101995
52: 3111690/68719476736 = 0.000045281049097
53: 3625296/68719476736 = 0.000052755000070
54: 4213531/68719476736 = 0.000061314945924
55: 4885800/68719476736 = 0.000071097747423
56: 5652519/68719476736 = 0.000082254977315
57: 6524676/68719476736 = 0.000094946532045
58: 7513761/68719476736 = 0.000109339613118
59: 8632392/68719476736 = 0.000125617836602
60: 9895172/68719476736 = 0.000143993704114
61: 11318943/68719476736 = 0.000164712299011
62: 12922002/68719476736 = 0.000188039877685
63: 14722912/68719476736 = 0.000214246567339
64: 16740147/68719476736 = 0.000243601200054
65: 18993237/68719476736 = 0.000276387974736
66: 21504670/68719476736 = 0.000312934134854
67: 24300765/68719476736 = 0.000353622672264
68: 27410349/68719476736 = 0.000398873075028
69: 30861907/68719476736 = 0.000449099854450
70: 34681548/68719476736 = 0.000504682946485
71: 38893797/68719476736 = 0.000565979236853
72: 43525017/68719476736 = 0.000633372357697
73: 48606891/68719476736 = 0.000707323357346
74: 54177087/68719476736 = 0.000788380377344
75: 60276503/68719476736 = 0.000877138561918
76: 66945348/68719476736 = 0.000974183029030
77: 74221239/68719476736 = 0.001080061178072
78: 82140424/68719476736 = 0.001195300486870
79: 90740262/68719476736 = 0.001320444600424
80: 100060014/68719476736 = 0.001456064841477
81: 110139021/68719476736 = 0.001602733696927
82: 121014342/68719476736 = 0.001760990446201
83: 132720651/68719476736 = 0.001931339662406
84: 145292686/68719476736 = 0.002114286849974
85: 158767221/68719476736 = 0.002310367141035
86: 173181327/68719476736 = 0.002520119989640
87: 188567386/68719476736 = 0.002744016615907
88: 204949707/68719476736 = 0.002982410762343
89: 222347634/68719476736 = 0.003235583921196
90: 240784492/68719476736 = 0.003503875515889
91: 260294934/68719476736 = 0.003787789813941
92: 280921986/68719476736 = 0.004087952926056
93: 302702132/68719476736 = 0.004404895764310
94: 325647132/68719476736 = 0.004738789459225
95: 349736019/68719476736 = 0.005089328900795
96: 374924485/68719476736 = 0.005455869322759
97: 401165883/68719476736 = 0.005837731921929
98: 428428884/68719476736 = 0.006234460801352
99: 456699560/68719476736 = 0.006645853281952
100: 485968203/68719476736 = 0.007071768093738
northwolves 2004-08-16
  • 打赏
  • 举报
回复
代码如下:

Option Explicit
Private Sub Command1_Click()
Dim x() As String
getp x
End Sub



Sub getp(ByRef result() As String)

Dim x(63) As Long, y(189) As Long
Dim s(23) As Integer, t(5) As Integer
Dim i As Long, j As Long, k As Integer
Dim temp As Integer, sum As Integer
Dim a As Long, b As Long, c As Long
For i = 0 To 23
s(i) = Choose(i + 1, 0, 1, 2, 3, 0, 4, 5, 6, 0, 7, 8, 9, 0, 10, 11, 12, 0, 13, 14, 15, 0, 16, 17, 18)
Next
For k = 0 To 63
For i = 0 To &HFFF
sum = 0
temp = i
For j = 5 To 0 Step -1
t(j) = temp Mod 4
temp = temp \ 4
sum = sum + s(4 * j + t(j))
Next
If sum = k Then x(k) = x(k) + 1
Next
Next

ReDim result(189)
For i = 0 To 189
For a = 0 To 63
For b = 0 To 63
For c = 0 To 63

If a + b + c = i Then y(i) = y(i) + x(a) * x(b) * x(c)
Next
Next
Next
result(i) = Right(" " & i, 3) & ":" & Right(Space(10) & y(i), 10) & "/" & "68719476736 = " & FormatNumber(y(i) / 68719476736#, 15, vbTrue)
Next
Debug.Print "概率如下:"
Debug.Print Join(result, vbCrLf)
End Sub

northwolves 2004-08-15
  • 打赏
  • 举报
回复
明天给你写一个。
northwolves 2004-08-15
  • 打赏
  • 举报
回复
六个骰子一起甩,结果相加。连甩三次,三次相加
一共189种可能
----------------------------
190种可能

另外,每种可能的概率在甩前就已经决定了。算法不是太难,只是好象价值不止10分,呵呵
laisiwei 2004-08-15
  • 打赏
  • 举报
回复
这种方法用遍历
要从0循环到4^18-1
现在看来不是很好。
速度只会变慢
BRBLM 2004-08-15
  • 打赏
  • 举报
回复
用一个循环
把循环的数字转为4进制数,用来表示每个骰子取到的数字
然后统计

怎么做?
laisiwei 2004-08-15
  • 打赏
  • 举报
回复
用一个循环
把循环的数字转为4进制数,用来表示每个骰子取到的数字
然后统计
laisiwei 2004-08-15
  • 打赏
  • 举报
回复
其实概率是不变的
只是测试的时候有细微的偏差
starsoulxp 2004-08-15
  • 打赏
  • 举报
回复
关注
BRBLM 2004-08-15
  • 打赏
  • 举报
回复
有人说应该排列组合来算概率,排列组合怎么用的???

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧