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

剧情提要:
[机器小伟]在[工程师阿伟]的陪同下进入练气期第九层功法的修炼,
这次要修炼的目标是[可能性]。

正剧开始:

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



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


[从头学数学] 第77节 可能性_第1张图片

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

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

<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>

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

[从头学数学] 第77节 可能性_第2张图片



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

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

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

关于骰子上的点数的规则,小伟参照这个:对面点的和为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
*
*/
 //骰子 dice
function 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>

来玩玩吧:

[从头学数学] 第77节 可能性_第3张图片


来上三个骰子一起玩:

<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>



[从头学数学] 第77节 可能性_第4张图片

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

[从头学数学] 第77节 可能性_第5张图片

[从头学数学] 第77节 可能性_第6张图片

这次掷了三个2。


这次是3个5。

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

[从头学数学] 第77节 可能性_第7张图片

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


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

你可能感兴趣的:([从头学数学] 第77节 可能性)