正剧开始:
星历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的豹子。
经过几十次的努力,小伟成功了!
本节到此结束,欲知后事如何,请看下回分解。