作者yuleen123 (.......................)
看板PHP
标题Re: [请益] 求救 乱数发牌
时间Thu May 15 01:33:16 2008
: $i = 0;
: while($i < 20) {
: $tmp = array_rand($cardArray);
: if(!in_array($tmp,$card2Array)) {
: $card2Array[$i] = $tmp;
: $i ++;
: }
: }
这边有个问题是
抽第一张牌每张牌被抽到的机率是 1/52
抽第二张牌时每张牌被抽到的机率变成 1/51 ( 因为少一张 )
抽第三张牌时每张被抽到的机率变成 1/50 ( 因为少两张 )
....
我的作法是建一个对照表
$Poker_map = array( "S1", "S2", ... , "S13", "H1", "H2", ... , "H13",
"D1", "D2", ... , "D13", "C1", "C2", ... , "C13 );
共 52 张牌
抽第一张牌时产生 0 ~ 51 的乱数值对应到 $Poker_map 对照表上
$num = rand( 0, 51 );
假设抽到 15 好了, 15 对照到对照表是 H3
把抽到的牌加到已发出牌的阵列中
$deal_map[] = $Poker_map[ $num ];
之後把抽到的牌从 $Poker_map 移除掉
移除的方法有很多种
需要注意的是移除後对照表的 key 要连续
这时候 $Poker_map 里面剩下 51 张牌
接下来抽第二张牌时产生 0 ~ 50 的乱数值
之後依照前面的方法加到已发牌的阵列中并从 $Poker_map 里移除
重复步骤直到发完牌
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.227.171.86
1F:→ yuleen123:欧.. 其实 c 大的方法就可以了.. XD 05/15 01:43
2F:推 cleanwind:只要能够达成要求,运算少的情况下是没差的 ^^ 05/15 01:46