[从头学数学] 第77节 可能性

来源:互联网 发布:ubuntu安装hp打印机 编辑:程序博客网 时间:2024/04/28 17:29
剧情提要:
[机器小伟]在[工程师阿伟]的陪同下进入练气期第九层功法的修炼,
这次要修炼的目标是[可能性]。

正剧开始:

星历2016年02月09日 11:10:48, 银河系厄尔斯星球中华帝国江南行省。
[工程师阿伟]正在和[机器小伟]一起观赏[可能性]。



这应该就是概率论和大伙的初次见面了吧,[工程师阿伟]暗自想着。



关于可能性,一向是和排列,组合分不开的。

于是小伟就把这些的相关工具都拿出来了:

<span style="font-size:18px;">#全排列def perm(array):    if (len(array)<=1):        return [array];    r = [];    for i in range(len(array)):        #抽去array[i]        s = array[:i]+array[i+1:];        p = perm(s);        for x in p:            #array[i]置顶            r.append(array[i:i+1]+x);    return r;</span>

<span style="font-size:18px;">#求组合数的选择集def choice(ceil, chance):    a = [[0]];    result = [];    end = 0;    bit = 0;    #次数    #chance = 2;    #最终封顶数    #ceil = 6;    while (bit <= chance):               bit = len(a[0]);        if (bit <= chance):            b = a.pop(0);            end = b[-1];            for i in range(end+1, ceil+1):                a.append(b+[i]);        else:            break;    for i in range(len(a)):        if a[i][-1] == ceil:            result.append(a[i]);                return result;</span>

上面这个组合选择工具是用于这样一种情况:

比如一个人想要确切的达到某个目的,那么这个目的地是确定的,但是这中间他所进行的每一步骤可以有多种选择,

而这个工具就可以告诉他有哪些选择符合要求。


而下面这个工具虽然也是组合,但用于另一类情况:

从某个大选择集中选出一部分组成一个子集,可以怎样选。

<span style="font-size:18px;">#求组合数的选择集def choice2(ceil, chance):    a = [];    result = [];    end = 0;    bit = 0;    #次数    #chance = 2;    #最终封顶数    #ceil = 6;    chance -= 1;    for i in range(ceil+1):        a.append([i]);            while (bit <= chance):               bit = len(a[0]);        if (bit <= chance):            if (len(a)>0):                b = a.pop(0);                end = b[-1];                if (end + chance - bit < ceil+1):                    for i in range(end+1, ceil+1):                        a.append(b+[i]);        else:            break;            return a;   </span>

虽然工具拿了出来,但是小伟发现,今天这层功法的修炼是用不上的,因为这层功法太简单了。




既然[人叫板老师]让小伟来掷这个正方体,小伟就来玩一玩吧。

这个正方体呢,其实就是大名鼎鼎的骰子。

小伟早就想有一个这样的玩具了,这不,时机到了。

关于骰子上的点数的规则,小伟参照这个:对面点的和为7。

<span style="font-size:18px;">def dice():    a = [];    for i in range(1, 7):        for j in range(1, 7):            for k in range(1, 7):                if i+j != 7 and i+k != 7 and j+k!=7 and \                   i != j and i != k and j!=k:                    a.append([i,j,k]);    print(a);</span>

这样可以得到所有的可能选择。

接下来就可以产生骰子了。

<span style="font-size:18px;">function myDraw() {     var config = new PlotConfiguration();      config.init();      config.setPreference(); config.setSector(1,1,1,1);config.axis3D(0, 0,0, 180);dice(80, 0, 'blue');}/*** @usage   骰子* @author  mw* @date    2016年02月09日  星期二  08:58:27 * @param* @return**/ //骰子 dicefunction dice(r, rot, style) {plot.save().rotate(rot).setLineWidth(5);r = r ? r : 50;//dice(-r/2, r/2, r/2, 100, 'blue');var array = new Array();//骰子面上颜色style = style ? style : 'red';//骰子边框var style2 = 'white';//骰子规律,对面点数相加为7,所以相邻三面的选择集共48项var choice = [[1, 2, 3], [1, 2, 4], [1, 3, 2], [1, 3, 5], [1, 4, 2], [1, 4, 5], [1, 5, 3], [1, 5, 4], [2, 1, 3], [2, 1, 4], [2, 3, 1], [2, 3, 6], [2, 4, 1], [2, 4, 6], [2, 6, 3], [2, 6, 4], [3, 1, 2], [3, 1, 5], [3, 2, 1], [3, 2, 6], [3, 5, 1], [3, 5, 6], [3, 6, 2], [3, 6, 5], [4, 1, 2], [4, 1, 5], [4, 2, 1], [4, 2, 6], [4, 5, 1], [4, 5, 6], [4, 6, 2], [4, 6, 5], [5, 1, 3], [5, 1, 4], [5, 3, 1], [5, 3, 6], [5, 4, 1], [5, 4, 6], [5, 6, 3], [5, 6, 4], [6, 2, 3], [6, 2, 4], [6, 3, 2], [6, 3, 5], [6, 4, 2], [6, 4, 5], [6, 5, 3], [6, 5, 4]];var size = choice.length;var size = choice.length;var rand = Math.round(Math.random() * size) % size;var a = choice[rand][0], b = choice[rand][1], c = choice[rand][2];//骰子绘制for (var i = 0; i < 2; i++) {array.push(point3D(-r, -r, r));array.push(point3D(r, -r, r));array.push(point3D(r, r, r));array.push(point3D(-r, r, r));if (i == 0) {shape.fillDraw(array, style);}else {shape.strokeDraw(array, style2);}}for (var i = 0; i < 2; i++) {array.push(point3D(r, r, r));array.push(point3D(r, -r, r));array.push(point3D(r, -r, -r));array.push(point3D(r, r, -r));if (i == 0) {shape.fillDraw(array, style);}else {shape.strokeDraw(array, style2);}}for (var i = 0; i < 2; i++) {array.push(point3D(-r, -r, r));array.push(point3D(r, -r, r));array.push(point3D(r, -r, -r));array.push(point3D(-r, -r, -r));if (i == 0) {shape.fillDraw(array, style);}else {shape.strokeDraw(array, style2);}}//骰面数字绘制style = 'white';var digit = new Digit();plot.save().transform(1, Math.PI/8, -Math.PI/8, 0.5, 0, 0);digit.number(a, point3D(-0.5*r, -1.5*r, 0)[0], point3D(-0.5*r,-1.5*r,0)[1], r, style);plot.restore();plot.save().transform(1, 0, 0, 1, 0, 0);digit.number(b, point3D(0, 0, r)[0], point3D(0,0,r)[1], r, style);plot.restore();var digit = new Digit();plot.save().transform(1, 0, 0, 1, 0, 0);digit.number(c, point3D(r, 0, 0)[0], point3D(r,0,0)[1], r, style);plot.restore();plot.restore();}//三维点function point3D(x0, y0, z0) {z0 = z0 /2;x0 = x0 - z0*0.707;y0 = y0 + z0*0.707;return [x0, y0];}</span>

来玩玩吧:



来上三个骰子一起玩:

<span style="font-size:18px;">function myDraw() {     var config = new PlotConfiguration();      config.init();      config.setPreference(); for (var i = 0; i < 3; i++) {config.setSector(1,3,1,i+1);config.axis3D(0, 0, 0, 100);dice(50, 0, 'red');}}</span>




但是这样不确定到底算哪个点,所以下面我们规定正面向上的点才算。



这次掷了三个2。


这次是3个5。

小伟想掷个三个6的豹子。


经过几十次的努力,小伟成功了!


本节到此结束,欲知后事如何,请看下回分解。

0 0
原创粉丝点击