查看完整版本: 教大家用計算機求任意張數牌的完美洗牌歸位次數

kazemaru 2007-7-20 20:49

教大家用計算機求任意張數牌的完美洗牌歸位次數

52張牌8次完美洗之後歸位,那麽不是52張呢?9uR2k{p Vyxb$O

6iwa"hd [size=12px][size=12px]最開始是想到如果54張會怎樣,我試著洗了20次,未果。我覺得可能要洗很多次,於是沒有繼續洗。小學學過basic語言,於是我找了個Qbasic,編了以下程序,A代表牌的張數(甚至可以輸入單數),運行程序之後的結果就是需要的次數。54張是52次,而2的N次方張牌需要N次,比如262144張牌就需要18次。單數張牌的結果等於單數張加一張牌的結果。也就是說262143張牌也是18次恢復本來次序。注意A要大於2,否則沒有意義。
R'| brTfZ6xk)f /Wu1v:{8].B
好久不編程了,想了好幾個小時終于趨近完美。hz*Jx0] [V
10 INPUT A
&Eg v1j6I{9Xve/` 20 IF INT(A / 2) <> A / 2 THEN A = A + 1
L8]%R7Z!\ | 30 FOR X = 2 TO A - 1: P = Xfn2[Y!w
40 T = 0
8\*t/u*}t },y.~(r$tD 50 IF P < A / 2 + 1 THEN P = P * 2 - 1: T = T + 1: GOTO 70UcFl6FPa0j8YG4Ju
60 IF P > A / 2 THEN P = (P - A / 2) * 2: T = T + 1: GOTO 70
@)X$C5x._ 70 IF P = X THEN B = B + 1)?0FB&vFU,o ?|"jZ
80 IF B = A - 2 AND X = A - 1 THEN PRINT T: END/n H)DO I]!S
90 IF P <> X THEN GOTO 50v?$uJLzr
100 NEXT
7MtNG)F(`5d(Atn 4G3l&UJT"D9K
可能有的魔友看不懂,我稍微解釋一下。
%R4K YT'R'h@D7i 10 INPUT A                                                                     
Bw'tUP7[_ 隨意輸入A(牌的張數)6YVgCn%w6c$a
2a;a YhjO`l$V
20 IF INT(A / 2) <> A / 2 THEN A = A + 1                          ^-\:O%Y-I p
如果A不是偶數,那麽假設張數是A+1張
,M };z%c!J:F
&H,y9t6[8ll w` l 30 FOR X = 2 TO A - 1: P = X                                            *rY$xl3M
循環開始 從第X(2)張牌到第A-1張牌(兩頭的牌其實一直不動),該張牌的位置設為P,當然一開始第二張牌就在它本來的位置,也就是P=X,請注意,這裡的=並不是相等的意思,而是=前面的變成和=後面的值相等
/[3szJ&cIm
g)@-KE h2HxK 40 T = 0                                                                        
ucAyrF_%I 洗牌次數(time)為零,因爲還沒開始嘛
+P-G EPf;C.}
(CZqe;X)a 50 IF P < A / 2 + 1 THEN P = P * 2 - 1: T = T + 1: GOTO 70      
C,V%O(rm 如果P<A/2+1(可以理解為牌facedown時,從底牌那邊開始數的前27張的位置),那麽P=P*2-1,也就是說,第二張會變成第三張,第三張會變成第五張…… 記一次洗牌次數。 %myj iz b
如果該條件不成立,進入下一個語句。
1l%T'v B3DghYXG
b8VZ ?N*w"w 60 IF P > A / 2 THEN P = (P - A / 2) * 2: T = T + 1: GOTO 70      
7cC,Y?0M y;^$OX;D 如果P > A / 2(可以理解為可以理解為牌facedown時,從頂牌那邊開始數的前27張的位置),那麽P=(P - A / 2) * 2,也就是說,第二張會變成第四張,第三張變成第六張……。 記一次洗牌次數
L+pL ^J1y
-B6} ?)w4ht\te!]T 70 IF P = X THEN B = B + 1   
$?7B1Y]GPJ 如果P=X,也就是該張牌回到了本來的位置,記有一張牌回到了原位。變量(B)如果不去給予值就是0。%M3J"ji/mZ'U5T\
4k }u I9RL2S3r/x_
80 IF B = A - 2 AND X = A - 1 THEN PRINT T: END            
2SU OQ6eD(lEf+f 如果除了兩頭的牌其他牌都回到了本來的位置, 並且  已經計算完了頂底兩張以外的所有牌,那麽顯示T,也就是洗牌次數,程序結束。如果該條件不滿足進入下面語句3L6cP*uXRG/K'y
3^K4_'s|(b
90 IF P <> X THEN GOTO 50         
L%G e9LaVR;g5X 如果P不等于X,也就是說該張牌沒有回到本來的位置,那麽回到50語句繼續“洗”,直到滿足了p=x,也就是回到原位,那麽該語句(90)的條件就不滿足了,那麽進入下面語句,不去50
L%n%Kk[5p(X kw 100 NEXT          循環到下一張牌,也就是說如果現在是第一次循環的結束,也就是整副牌的第二張牌回到了原位,那就去考慮下一張牌md0ZK o`4IB0`cX'r
oE^)^ I fN7F
我本來擔心兩個問題:一個是,單數張的話是否像帖子開頭說的那樣情況和A+1一樣,我試了很多例子,目前沒發現例外,不過我不會證明絕對沒有,不過應該沒問題。另一個問題,就是万一出現洗了一定次數之後一部分牌歸位,而有的沒有歸位怎麽辦,我通過稍微修改程序,試了很多數,沒出現這個問題,也就是說只要一張牌歸位,所有牌都應該會歸位。還是那句話,我沒辦法證明,所以不敢保證。/~+VNp!B'w~
R}bE#tay-G9eJ
如果你看到這裡,而且理解了,我也沒白費力氣。謝謝你看我的帖子。不懂儘管問。魔術我是新手,多交流。^^[/size][/size]{ et7l}(G5aW#q
[size=12px][/size]_;J-]U4gw8[ e
[size=12px]+++++++++++++++++++++++++++++++++++++[/size]
`-O'F[2I(K*h~:YKC
Y_XPC3nP [color=red]sisisi123:[/color]
}(V!\6\rFl7RcJ b [color=red][/color]
|F'E{\ [color=red]关于尊驾的意见,在下决定如下:[/color],Py5B+m+mP hw7Z|/q
[color=red]诚然此帖既可算作魔術知識,又可算作撲克魔術交流,還可算作撲克魔術教學。[/color]
2Nye;F2y rG [color=red]然而一贴多发实不可取[/color]X/x PY[t h8t
[color=red]鉴于尊驾所发帖子题目的讨论语气[/color]J[i.gRf,^
[color=red]交流区更为合适[/color]
4Hh)H FH [color=red]王瑶斑竹的处理十分正确[/color]JjvCO
[color=red]然并非不可更改[/color]3?+eRF2C)M#N2md
[color=red]我将编辑此贴为教学贴后重新转移回来[/color]
#w\%]_:\H$H!p1U [color=red]并删除多发的两个帖子[/color]
%M)Y/XFbo#l [color=red]感谢支持。[/color]gVW%e3Z-C
[size=12px]0du4UIEfNd m'C2e

5O+}4I$Do4Oj!T [/size]
A^l5rl+D"K 7ZfU3g e#L!C4J;c
[[i] 本帖最后由 kazemaru 于 2007-7-29 08:20 编辑 [/i]]

caopcao 2007-7-20 22:04

晕,用得着这么算吗,洗8次就知道了啊。肯定是回到原来顺序的

sisisi123 2007-7-21 00:30

很不错的思路
/z:X]8A q #q;cY3b~ F3?(U#U,T
不过以后能不能用C语言表达?
+~ft/]9_
vs7q1p!H&eN"N$e basic語言都忘光了%jd6CHB#[1Sh
cc%o$~eY*B1X
不习惯读没有定义就用变量的程序了%i9Kaoh3F-Pa G-Dk \e
y8o s)g.a!{$a&ab
看了半天才熟悉过来

sisisi123 2007-7-21 00:35

單數張牌的結果等於單數張加一張牌的結果。也就是說262145張牌也是18次恢復本來次序。E6jvh5}f S
|^9x!F:fu
这句错了,应该是262143和262144一样,262145应该和262146一样。:lol

kazemaru 2007-7-21 00:37

哦,不好意思,是錯了,已更改,謝謝 R ?0u0H;mx7|.Y/s

4TP@6`x$K C不會,不好意思。
|S4D7JP ow8{5l
0\l4T;H&yj [[i] 本帖最后由 kazemaru 于 2007-7-21 00:43 编辑 [/i]]

sisisi123 2007-7-21 12:30

论坛一直登不上,到现在再回这一贴
,gN0Q ['CX R
6J2|,j0U FLi4L+y 关于如何证明 “只要一張牌歸位,所有牌都應該會歸位。“4cE},h-YN$t;i

"w ]6j c&nF 其实很简单,在外面加一个关于X的循环,把所有X取值试一遍,穷举证明。s/g Ri~1C1Qada6U

6Ikr4Xtgs 虽然在数学上这种证明不充分,但一般应用够了!H6~"}`zW
Dr'cO7r[A _N7~
如果为了程序的严谨而不考虑简洁性的话,
3x7C7xfY4_&D3F1cs mI N%?-h
可以考虑把验证所有X取值作为程序的一部分,
(LL,BvpFe;b/Q5jx }(BE6B,D"S
这都很简单。
jT3n'~D~a
.|iy!I&\`K 或者用数学的不完全归纳法Ax J!z/Q2e0Z]Y6{
!wB$J]?\|!E C
设X为未知数,证明X的取值不影响运算结果就好了
&D#^E2o;a9h] 'Z(x}$|5ED2O5w
我感觉是可以证明的,对于搞数学的不很难,不过我证不了。m.n'`Bma&x+\1H6R
k"]Fl*a4d|/X Q
最后,绝对要加精, pO%}6U5Qa4U
^i+?MwY2^(NV
[size=3][color=red]这是我见到的论坛上第一个用计算机语言研究魔术的帖子)u\;[2A0p5n

d}^ TuN(J ]"A};U;t3{ 绝对有里程碑意义!!!!!!!!!![/color][/size]l"}h#s5{F
F L c&Fc3M m
[[i] 本帖最后由 sisisi123 于 2007-7-21 12:41 编辑 [/i]]

sisisi123 2007-7-21 12:40

我觉得这段程序最出彩的地方就是以一张牌代替整幅牌
^ z HW[.w )K(zOE,W7HI
如果我做的话,绝对想不到。j XmxvT B*T
U&[F8M7f1u@
出来的东西程序复杂度绝对是你的n倍

kazemaru 2007-7-21 18:53

我不太同意斑竹的説法喲
H?B*tUR x
TZ['BJ0P Fr[bi f 我所說的不能證明,是不能100%證明,不過已經用了"擧"的方法去不完全歸納.我只是爲了嚴謹,才說我不能證明。
"_Yx D{%E] dQ:h~V4ta!G]q
而且我並不是以一張牌代替整副牌喲,一開始是這樣的,但是一開始覺得可能出現帖子中提及的”部分牌歸位部分牌不歸位“的情況,所以改用了計算歸位牌數量的做法,也就是有關B=B+1和 if B=A-2的部分。所以,其實這個程序是把同時進行的對A-2張牌的“洗”,在不同時間計算。
2y$BO$]/o
$S$s*Db;l/M 多謝加精。px2@ Y+]#rP*Z

U$ZR^ t3G{Fb [[i] 本帖最后由 kazemaru 于 2007-7-23 03:18 编辑 [/i]]

kazemaru 2007-7-21 19:01

我本來還在想,什麽時候能夠50分去教學區看帖,沒想到……:lol

天才魔術師 2007-7-21 19:12

厲害,謝謝!!!但是什么時候才可以有50積分呢?

baiypeng 2007-7-21 22:42

看的眼花了。。不过斑竹还是辛苦了

kazemaru 2007-7-22 18:54

自己頂頂頂頂頂頂下:'(

一旧云 2007-7-25 17:27

利害`~~~~~~~~

sisisi123 2007-7-27 12:22

关于尊驾的意见,在下决定如下:
yMs _ d H#k;pc4G NP6H8q [*l I;x2Qc!}
诚然此帖既可算作魔術知識,又可算作撲克魔術交流,還可算作撲克魔術教學。
.@C+PU@${h~-JP
A KV,_b yZL 然而一贴多发实不可取
4\%]9N)z3N7OA8R~
3F$\.c[3kDo 鉴于尊驾所发帖子题目的讨论语气
9hG0lsCy/_xz x&L6Z&T{7^8Ci`g
交流区更为合适
s)g2V0Xl8E'C
@U%IX A e1C\%| 王瑶斑竹的处理十分正确 TA&xv.b$Q | Q

VUz!ncl"@4H/Y.d9X 然并非不可更改
B ft&Q] Z1W*S)~ M.~T6I
我将编辑此贴为教学贴重新转移回来?IG"^wz
Ngi0d4^/cl
并删除多发的两个帖子

proview00999 2007-7-27 21:34

C语言呢,唔太明白,可是支持一番!!!

Acail 2007-7-27 23:21

厉害啊~~~LZ太帅了

新数码摄影 2007-7-28 10:25

厲害,謝謝!!!

新数码摄影 2007-7-28 10:51

厲害,謝謝!!!但是什么時候才可以有50積分呢?

kazemaru 2007-7-28 23:13

其實,把P<>X放在前面說會比較合理,這樣子相對不容易看懂。

manyue 2007-7-29 10:01

LZ辛苦了~~~~~~
页: [1] 2
查看完整版本: 教大家用計算機求任意張數牌的完美洗牌歸位次數