27 123
发新话题
打印

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

本主题由 sisisi123 于 2007-7-27 12:19 移动

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

52張牌8次完美洗之後歸位,那麽不是52張呢?

最開始是想到如果54張會怎樣,我試著洗了20次,未果。我覺得可能要洗很多次,於是沒有繼續洗。小學學過basic語言,於是我找了個Qbasic,編了以下程序,A代表牌的張數(甚至可以輸入單數),運行程序之後的結果就是需要的次數。54張是52次,而2的N次方張牌需要N次,比如262144張牌就需要18次。單數張牌的結果等於單數張加一張牌的結果。也就是說262143張牌也是18次恢復本來次序。注意A要大於2,否則沒有意義。

好久不編程了,想了好幾個小時終于趨近完美。
10 INPUT A
20 IF INT(A / 2) <> A / 2 THEN A = A + 1
30 FOR X = 2 TO A - 1: P = X
40 T = 0
50 IF P < A / 2 + 1 THEN P = P * 2 - 1: T = T + 1: GOTO 70
60 IF P > A / 2 THEN P = (P - A / 2) * 2: T = T + 1: GOTO 70
70 IF P = X THEN B = B + 1
80 IF B = A - 2 AND X = A - 1 THEN PRINT T: END
90 IF P <> X THEN GOTO 50
100 NEXT

可能有的魔友看不懂,我稍微解釋一下。
10 INPUT A                                                                     
隨意輸入A(牌的張數)

20 IF INT(A / 2) <> A / 2 THEN A = A + 1                          
如果A不是偶數,那麽假設張數是A+1張

30 FOR X = 2 TO A - 1: P = X                                            
循環開始 從第X(2)張牌到第A-1張牌(兩頭的牌其實一直不動),該張牌的位置設為P,當然一開始第二張牌就在它本來的位置,也就是P=X,請注意,這裡的=並不是相等的意思,而是=前面的變成和=後面的值相等

40 T = 0                                                                        
洗牌次數(time)為零,因爲還沒開始嘛

50 IF P < A / 2 + 1 THEN P = P * 2 - 1: T = T + 1: GOTO 70      
如果P<A/2+1(可以理解為牌facedown時,從底牌那邊開始數的前27張的位置),那麽P=P*2-1,也就是說,第二張會變成第三張,第三張會變成第五張…… 記一次洗牌次數。
如果該條件不成立,進入下一個語句。

60 IF P > A / 2 THEN P = (P - A / 2) * 2: T = T + 1: GOTO 70      
如果P > A / 2(可以理解為可以理解為牌facedown時,從頂牌那邊開始數的前27張的位置),那麽P=(P - A / 2) * 2,也就是說,第二張會變成第四張,第三張變成第六張……。 記一次洗牌次數

70 IF P = X THEN B = B + 1   
如果P=X,也就是該張牌回到了本來的位置,記有一張牌回到了原位。變量(B)如果不去給予值就是0。

80 IF B = A - 2 AND X = A - 1 THEN PRINT T: END            
如果除了兩頭的牌其他牌都回到了本來的位置, 並且  已經計算完了頂底兩張以外的所有牌,那麽顯示T,也就是洗牌次數,程序結束。如果該條件不滿足進入下面語句

90 IF P <> X THEN GOTO 50         
如果P不等于X,也就是說該張牌沒有回到本來的位置,那麽回到50語句繼續“洗”,直到滿足了p=x,也就是回到原位,那麽該語句(90)的條件就不滿足了,那麽進入下面語句,不去50
100 NEXT          循環到下一張牌,也就是說如果現在是第一次循環的結束,也就是整副牌的第二張牌回到了原位,那就去考慮下一張牌

我本來擔心兩個問題:一個是,單數張的話是否像帖子開頭說的那樣情況和A+1一樣,我試了很多例子,目前沒發現例外,不過我不會證明絕對沒有,不過應該沒問題。另一個問題,就是万一出現洗了一定次數之後一部分牌歸位,而有的沒有歸位怎麽辦,我通過稍微修改程序,試了很多數,沒出現這個問題,也就是說只要一張牌歸位,所有牌都應該會歸位。還是那句話,我沒辦法證明,所以不敢保證。

如果你看到這裡,而且理解了,我也沒白費力氣。謝謝你看我的帖子。不懂儘管問。魔術我是新手,多交流。^^


+++++++++++++++++++++++++++++++++++++

sisisi123:

关于尊驾的意见,在下决定如下:
诚然此帖既可算作魔術知識,又可算作撲克魔術交流,還可算作撲克魔術教學。
然而一贴多发实不可取
鉴于尊驾所发帖子题目的讨论语气
交流区更为合适
王瑶斑竹的处理十分正确
然并非不可更改
我将编辑此贴为教学贴后重新转移回来
并删除多发的两个帖子
感谢支持。




[ 本帖最后由 kazemaru 于 2007-7-29 08:20 编辑 ]

TOP

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

TOP

很不错的思路

不过以后能不能用C语言表达?

basic語言都忘光了

不习惯读没有定义就用变量的程序了

看了半天才熟悉过来

TOP

單數張牌的結果等於單數張加一張牌的結果。也就是說262145張牌也是18次恢復本來次序。

这句错了,应该是262143和262144一样,262145应该和262146一样。

TOP

哦,不好意思,是錯了,已更改,謝謝

C不會,不好意思。

[ 本帖最后由 kazemaru 于 2007-7-21 00:43 编辑 ]

TOP

论坛一直登不上,到现在再回这一贴

关于如何证明 “只要一張牌歸位,所有牌都應該會歸位。“

其实很简单,在外面加一个关于X的循环,把所有X取值试一遍,穷举证明。

虽然在数学上这种证明不充分,但一般应用够了

如果为了程序的严谨而不考虑简洁性的话,

可以考虑把验证所有X取值作为程序的一部分,

这都很简单。

或者用数学的不完全归纳法

设X为未知数,证明X的取值不影响运算结果就好了

我感觉是可以证明的,对于搞数学的不很难,不过我证不了。

最后,绝对要加精,

这是我见到的论坛上第一个用计算机语言研究魔术的帖子

绝对有里程碑意义!!!!!!!!!!


[ 本帖最后由 sisisi123 于 2007-7-21 12:41 编辑 ]

TOP

我觉得这段程序最出彩的地方就是以一张牌代替整幅牌

如果我做的话,绝对想不到。

出来的东西程序复杂度绝对是你的n倍

TOP

我不太同意斑竹的説法喲

我所說的不能證明,是不能100%證明,不過已經用了"擧"的方法去不完全歸納.我只是爲了嚴謹,才說我不能證明。

而且我並不是以一張牌代替整副牌喲,一開始是這樣的,但是一開始覺得可能出現帖子中提及的”部分牌歸位部分牌不歸位“的情況,所以改用了計算歸位牌數量的做法,也就是有關B=B+1和 if B=A-2的部分。所以,其實這個程序是把同時進行的對A-2張牌的“洗”,在不同時間計算。

多謝加精。

[ 本帖最后由 kazemaru 于 2007-7-23 03:18 编辑 ]

TOP

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

TOP

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

TOP

 27 123
发新话题