>>777
もし、RAND_MAXが50だったら、y[0]=9、y[1]=18、...、y[4]=45、y[5]=50 という様な値が入る事になります。
実際はもっと大きな値ですが、RAND_MAX未満の乱数が発生したとき、その発生させた乱数が、
「どの範囲にあるか」で、「どのカードに対応」とすることになります。その範囲の境界になる値が入ります。

>>while(k!=63){
>>   r=rand();
>>   if(r<y[2]) k |= 1+(r>y[0]) + 2*(r>y[1]) ;
>>   else    k |= 8*(1+(r>y[3]) + 2*(r>y[4]));
>>   count++;
>>}
kの計算の中に、“(r>y[0])”の様な「条件式」がありますが、
「条件式」は正しければ 1 間違っていれば、 0 という値を取ります。
式の右辺全体で見れば、r<y[0] なら 1、y[0]≦r<y[1]なら 2、...、y[3]≦r<y[4]なら 16
y[4]≦r なら 32 という値を取ることになります。
これらの値を、kに繰り返し「論理和」として、追加していきます。
kの値が63になったときは、1,2,4,8,16,32、全ての値を取ったと言うことなので、ループを脱出します。
このような事を通して、全ての種類が出るまで、何度乱数を発生さる必要があったかをカウントしてます。
カード1が出て、かつ、カード2が出て、かつ、... という様な判定式を書くより、
上のようにkを制御すれば、kの値が63かどうかの判定だけで済みます。