用Excel写个摸球模拟器玩玩
- 背景
- 代码实现
- 相关资料
 
背景
最近对象有个需求,想要帮忙写个程序,实现功能:模拟两种颜色的球,随机摸球N次后,摸到不同颜色的次数。
考虑到非程序员的环境配置问题,直接用Excel中的宏开发模式,把许久前学过的VB语言捡起来,简单实现了下,效果如下:

代码实现
实现思路
- 界面区: 
  - 设置两种颜色球的个数
- 设置1000、10000、100000次模拟循环按钮
- 单元格实时刷新摸球模拟结果,并可视化为进度条
 
- 代码区: 
  - 编写ms级延时函数delay()
- 编写核心处理函数main_process(),模拟摸球过程 
    - 随机函数生成0-1区间的数
- 根据几何概型将不同类型球的个数转换为概率
- 统计随机函数生成结果在不同区间的次数,并延时显示到单元格上
 
- 不同按钮设置循环次数传递给main_process()
- 归零按钮实现单元格数据清零
 
VB代码
Private Declare PtrSafe Function timeGetTime Lib "winmm.dll" () As Long
Sub delay(T As Long)
    Dim time1 As Long
    time1 = timeGetTime
    Do
        DoEvents
    Loop While timeGetTime - time1 < T
End Sub
Sub main_process(loop_times As Long)
    red = 4
    yellow = 3
    ratio_red = red / (red + yellow)
    normalised_val = 0
    
    Range("b5").Value = 0
    Range("b6").Value = 0
    
    delay_t = 0
    If looptimes = 1000 Then
      delay_t = 2
    End If
    
    If loop_times = 10000 Then
      delay_t = 1
    Else
      delay_t = 0
    End If
      
    
    For i = 1 To loop_times
    
        If loop_times <> 100000 Then
            delay (delay_t)
        End If
            
        
        normalised_val = Rnd()
        If normalised_val < ratio_red Then
            Range("b5").Value = Range("b5").Value + 1
        Else
            Range("b6").Value = Range("b6").Value + 1
        End If
    Next i
    
End Sub
Sub 按钮1_Click()
    loop_times = 1000
    main_process (loop_times)
End Sub
Sub 按钮2_Click()
    loop_times = 10000
    main_process (loop_times)
End Sub
Sub 按钮3_Click()
    loop_times = 100000
    main_process (loop_times)
End Sub
Sub 按钮4_Click()
    Range("b5").Value = 0
    Range("b6").Value = 0
End Sub
如果有兴趣需要现成的excel文件可以评论留言,有需求再放上来,当然还是鼓励自己去尝试下。
相关资料
- VBA延时的三个方法,link
- VBA常用函数参考,link






![[附源码]Python计算机毕业设计-高校人事管理系统Django(程序+LW)](https://img-blog.csdnimg.cn/94f9e07063e14bd88929cfe2ed9a0386.png)


![[附源码]Python计算机毕业设计高校教材网上征订系统Django(程序+LW)](https://img-blog.csdnimg.cn/b9889f9d285145ee99572f24dfbbb393.png)









![[附源码]Nodejs计算机毕业设计基于的二手车商城Express(程序+LW)](https://img-blog.csdnimg.cn/2f86d4e154414623a98740753168ac0e.png)