您的位置:首页 > 其它

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

2016-02-09 11:33 357 查看
剧情提要:

[机器小伟]在[工程师阿伟]的陪同下进入练气期第九层功法的修炼,

这次要修炼的目标是[可能性]。

正剧开始:

星历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
*
*/
//骰子 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>


来玩玩吧:





来上三个骰子一起玩:

<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的豹子。



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



本节到此结束,欲知后事如何,请看下回分解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: