掷骰子太费时?不妨用GeoGebra模拟掷骰子!3D、可自动

讲到掷骰子的概率问题时,如果要实际操作掷骰子,不仅耗时,实际效果也不尽人意。

那么,如果可以用软件GeoGebra来模拟掷骰子,并自动记录投掷点数,还能自动计算出相应的频数、频率,岂不是省时省力?若是再有自动投掷多次骰子的功能,就更棒了!

来看看用GeoGebra模拟掷骰子的效果:

还可以一次性掷20次:

如果不点击复位按钮,投掷的次数就可以不断累积起来,由此可以观察频数、频率的变化!

---------------------------------------二次编辑------------------------------------

如果不想文本一直在“闪”,请查看:《据说,这么改,就完美了!》,效果如下:

---------------------------------------二次编辑------------------------------------

这样的效果还不错吧?

来看看制作思路:

  • 骰子看成一个立方体,GeoGebra中有相应的指令——正六面体(Cube)
  • 骰子的面上分别有一到六个孔,一个孔可当做一个圆——圆周(Circle)
  • 掷骰子,也就是让骰子转动——旋转(Rotate)
  • 至于点数的显示、统计——条件计数(CountIf)

下面,让我们开始制作吧!

骰子的制作

■ 制作棱长为2的立方体,且后续不会用到立方体的点、棱、面,于是放进列表里:

l1 = {正六面体((0, 0, 0), (2, 0, 0), (2, 2, 0))}

■ 点击3D绘图区,再于指令栏输入:

中心定位((0,3,0.5))

z = -1

注:中心定位(CenterView)

骰子面上的孔,可用圆周指令:

圆周( <圆心>, <半径>, <轴向量> )

示例

为了避免每次都要思索圆的圆心与轴向量,我们可以只考虑圆在立方体上底面的情形,再将圆旋转到相应的面即可!

■ 所需旋转轴为:

f = 直线((1, 1, 1), x轴)

g = 直线((1, 1, 1), y轴)

注:直线(Line)x、y、z轴分别为xAxis、yAxis、zAxis

以点数是2为例,在立方体的上底面时为:圆周((1, 0.5, 2), 0.2, z轴)圆周((1, 1.5, 2), 0.2, z轴)

■ 用映射(Zip)指令可一条搞定,即为:

c2 = 映射(圆周((a, b, 2), 0.2, z轴), a, {1, 1}, b, {0.5, 1.5})

■ 两点的最终位置为:

d2 = 旋转(c2, -90°, g)

请自行隐藏c2

■ 同理,可以得到三、四、五点。而一、六点可直接得到:

目前效果如下:

圆的显示不大好,稍后再说明如何设置

掷骰子效果

主要是旋转轴、旋转角度的设定。

示例

希望掷骰子时,不要一直在“原地”,有“跑远”的效果。

■ 那么,只需让相应的旋转轴不唯一。于是:

h = 随机元素(序列(直线((j, 1, 1), z轴), j, -1, 1, 0.1))

注:随机元素(RandomElement)、序列(Sequence)

■ 于是,旋转轴为f,g,h,而对应的旋转角度——前两者应是90°的倍数(保证旋转后整个面都平行于平面z=-1),后者可为任意度数:

注:滑动条(Slider)、去除(Remove)

所以,立方体最基本的旋转效果为:旋转(旋转(旋转(l1, a1 k, f), a2 k, g), a3 k, h)

而为了有旋转多圈的效果,旋转度数还可加上720°或-720°(正负取决于相应的a1,a2,a3的正负)。

■ 另外,想要掷骰子的速度是由慢到快、再由快到慢,还可以再引入一个滑动条:

k' =滑动条(0,1)

■ 于是:

l3 = 旋转(旋转(旋转(l1, sgn(a1) 720° k' + a1 k, f), sgn(a2) 720° k' + a2 k, g), sgn(a3) 720° k' + a3 k, h)

注:sgn是符号函数。当x为时,sgn(x)为1;当x为时,sgn(x)为-1;当x为时,sgn(x)为0

立方体转动时,“点数”也要一起转动。

■ 六个面上的“孔”的转动,可用执行(Execute)指令一次性搞定:

执行(序列("e"+j+"=Rotate(Rotate(Rotate(d"+j+",sgn(a1) 720° k' + a1 k, f),sgn(a2) 720° k' + a2 k, g), sgn(a3) 720° k' + a3 k, h)", j,1,6))

■ 并设置e1,e2,e3,e4,e5,e6不在绘图区显示,且图层为1:

最关键的地方来啦!

■ 先引进滑动条:

让v等于90时,v'就等于v。这与后续的自动投掷有关

■ 并将滑动条kk'的速度分别设为:vv'

■ 再在k'的更新时脚本输入:

启动动画(k,k'>0.3)

注:启动动画(StartAnimation)

■ 最后,创建掷骰子按钮:

效果如下:

显示投掷结果

掷骰子的结果,即骰子向上的一面的点数。也就是要计算投掷完,“孔”(圆)在平面z=2上的数量。

由此,可转化为计算圆心的z坐标为2的数量——利用中心(Center)、条件计数(CountIf)指令。

而k,k'决定了e1,e2,e3,e4,e5,e6的位置,为避免k,k'在变化时,会对结果的统计有影响。

■ 不妨,直接构造出转动结束后的六个面上“孔”:

执行(序列("f"+j+"=Rotate(Rotate(Rotate(d"+j+",sgn(a1) 720° + a1, f),sgn(a2) 720° + a2, g), sgn(a3) 720° + a3, h)", j,1,6))

■ 于是:

注:扁平列表(Flatten)、公式文本(FormulaText)

k'为1,即转动结束时,才显示结果


自动投掷

■ 创建整数滑动条:

■ 创建自动20次按钮:

注:运行单击脚本(RunClickScript)、设置标题(SetCaption)。

目前效果如下:

之前点击button1,即投掷1次。但,现在投掷次数n显示错误!

■ 于是,创建掷骰子按钮:


统计投掷结果

■ 创建一个列表,用来存放投掷结果:

l5={}

■ 投掷结束时,将结果放进列表里。即,k'的更新时脚本写上:

如果(k'==1,赋值(l5,追加(l5, a)))

注:赋值(SetValue)、追加(Append)

由此即可进行统计:

■ 最后,创建复位按钮:


如需本作品的源文件,请回复:掷骰子

另外,推荐用GeoGebra模拟转盘

了解更多
举报
评论 0