作者libery ()
看板C_Sharp
标题Re: [问题] 请问大家对这个问题有何看法
时间Wed Dec 8 02:04:38 2004
※ 引述《seagal (待救的小米)》之铭言:
: ※ 引述《erichugh (转阿转~~)》之铭言:
: : 这是大一计概的东西 没有那麽复杂
: : 不能使用阵列 是教授规定的
: : 我所想到的是 使用binary bits纪录牌是否已经发过
: : 使用long 52张牌都能纪录到
: : 发过是1未发是0
: : 使用 && 或是 / 检查是否有发过
: : 大致上是这样子的概念
: 你这样做也可以
: 骨子里其实跟array是一样的
: 既然你教授这样要求 那就来想一个适合他的版本吧
: 要完成扑克牌洗牌问题
: 我们需要两样东西
: 1. data structure: 储存52张扑克牌
: 2. algorithm: 实作洗牌演算法
: 最适合储存扑克牌 当然就是array啦
: 稍後再来研究这边如何不要用array
: 第二步骤是洗牌演算法
: 这种演算法叫做shuffle
: 我们可以选用fisher_yates_shuffle
: 步骤很简单
: ------------------
: for i = 0 to 51
: j = int rand(i+1)
: change element at i, j
: ------------------
: 洗牌完之後就很简单了 前面十三张扑克牌发给第一人 之後十三张发给第二人...
: 要注意的是选用fisher_yates的原因
: 重点在虚拟码第二行 透过改变选择乱数范围 避免有问题
: 这边我就不多作解释了
: 所以你不想用阵列存也可以
: 只要弄个像阵列的东西出来
: 可以实作洗牌演算法就好
: 例如你说的那个方法
P(1) P(2) P(3) P(4)代表四组人 ()内的值只是为了好表达可以用非阵列方式作
I(1) I(2) I(3) I(4)代表四组人index count
C(1) C(2) C(3) C(4)代表四组花色
I1=I2=I3=I4=13
for(int i = 1 ; i <= 4 ; i++)
for(int j = 1 ; j <= 13 ; j++)
{
int r = Random(4);
while(I(r)==0)
r = Random(4);
P(r)+=C(i)+j;
I(r)--;
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.104.240.176
1F:推 seagal:看无 可不可以解释一下啊 140.109.73.177 12/08