首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

扑克洗牌调整顺序,算法怎么处理

2013-08-09 
扑克洗牌调整顺序,算法怎么办?扑克洗牌调整顺序,算法怎么办?1.给下列数据赋值c(1),c(2),c(3),c(4),c(5),c(

扑克洗牌调整顺序,算法怎么办?
扑克洗牌调整顺序,算法怎么办?
1.给下列数据赋值c(1),c(2),c(3),c(4),c(5),c(6),c(7),c(8),c(9),c(10),c(11),c(12),c(13),好做
2.取随机数n=int(rand()*13)+1,例如n=6
3.调整后的顺序为c(1),c(2),c(3),c(4),c(5),c(7),c(8),c(9),c(10),c(11),c(12),c(13),c(6)
第6个数移到最后,c(7),c(8),c(9),c(10),c(11),c(12),c(13),各前移1个位置。
4.再取随机数n=int(rand()*12)+1,例如n=3
5.上面的顺序调整后的顺序为c(1),c(2),c(4),c(5),c(7),c(8),c(9),c(10),c(11),c(12),c(13),c(3),c(6)
第三个数移到倒数第2的位置,第4、5、6、、、11个数个向前移动一个位置。
6.再取随机数n=int(rand()*11)+1,例如n=5
7.再调整后的顺序为c(1),c(2),c(4),c(5),c(8),c(9),c(10),c(11),c(12),c(13),c(7),c(3),c(6)
8.、、、、、
9.、、
连续操作5次,怎么办?各位老师出手谢谢  
[解决办法]
用数组也可以呀。不过每抽一张牌就搬移所有其他牌的做法很滑稽,完全用不着。

Option Explicit
Dim c(1 To 13) As Integer, tmp(1 To 13) As Integer
Dim i As Integer
Private Sub Command1_Click()
    Dim n As Integer
    
    'buffer your current state
    For i = 1 To 13
        tmp(i) = c(i)
    Next i
    
    'pick up 5 cards and put them at the tail
    Randomize
    For i = 1 To 5
myLoop:
        n = Int(Rnd * 13) + 1
        If tmp(n) = 0 Then GoTo myLoop
        c(14 - i) = tmp(n)
        tmp(n) = 0
    Next i
    
    'restore your remain cards
    n = 1
    For i = 1 To 13
        If tmp(i) > 0 Then
            c(n) = tmp(i)
            n = n + 1
        End If


    Next i
    
    'show your new order
    For i = 1 To 13
        Debug.Print IIf(i = 1, "", ", ") & c(i);
    Next i
    Debug.Print
End Sub

Private Sub Form_Load()
    'initial state
    For i = 1 To 13
        c(i) = i
    Next i
End Sub




[解决办法]
洗牌算法参考:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int d[6];
int i,n,a,b,t;
int c,j;
void main() {
    srand(time(NULL));
    printf("shuffle 0..n-1 demo\n");
    for (n=1;n<=5;n++) {/* 测试1~5个元素 */
        printf("_____n=%d_____\n",n);
        j=1;
        for (c=1;c<=n;c++) j=j*c;/* j为n! */
        j*=n*2;
        for (c=1;c<=j;c++) {/* 测试n*2*n!次 */
            for (i=0;i<n;i++) d[i]=i;/* 填写0~n-1 */
            for (i=n;i>0;i--) {/* 打乱0~n-1 */
                a=i-1;b=rand()%i;
                if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}
            }
            printf("%04d:",c);
            for (i=0;i<n;i++) printf("%d",d[i]);
            printf("\n");
        }
    }
    printf("shuffle 1..n demo\n");
    for (n=1;n<=5;n++) {/* 测试1~5个元素 */
        printf("_____n=%d_____\n",n);
        j=1;


        for (c=1;c<=n;c++) j=j*c;/* j为n! */
        j*=n*2;
        for (c=1;c<=j;c++) {/* 测试n*2*n!次 */
            for (i=1;i<=n;i++) d[i]=i;/* 填写1~n */
            for (i=n;i>1;i--) {/* 打乱1~n */
                a=i;b=rand()%i+1;
                if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}
            }
            printf("%04d:",c);
            for (i=1;i<=n;i++) printf("%d",d[i]);
            printf("\n");
        }
    }
}

热点排行