2014-06-25 118 views
0

所以,我受到同事的挑战,建立一个随机的扑克手发电机。当时,我所有的就是我的手机,我可以运行PHP。 所以,一些修补和大量的搜索后,我想出了这个:in_array随机错误

<?php 
    $cards; 
    $card = array(); 
    function GetCard($getSuit, $getNumber){ 
    for($s=0; $s < 4; $s++){ 
      for($n=0; $n < 13; $n++){ 

       if($s == 0){ 
     //Clubs 
        $suits[$s] = "-C"; 
       } else if($s == 1){ 
     //Hearts 
        $suits[$s] = "-H"; 
       } else if($s == 2){ 
     //Spades 
        $suits[$s] = "-S"; 
       } else if($s == 3){ 
     //Diamonds 
        $suits[$s] = "-D"; 
       } 
       if($n == 0){ 
        $num[$n] = "A"; 
       } else if($n == 10){ 
        $num[$n] = "J"; 
       } else if($n == 11){ 
        $num[$n] = "Q"; 
       } else if($n == 12){ 
        $num[$n] = "K"; 
       } else { 
        $num[$n] = $n+1; 
       } 
       $cards[$s][$n] = $num[$n].$suits[$s]; 
      } 
     } 
     return $cards[$getSuit][$getNumber]; 
    } 
    function GetRandomPokerHand(){ 
     $i = 0; 
     while($i < 5){ 
       mt_srand(); 
     $rs = mt_rand(0,3); 
     $rn = mt_rand(0,12); 
     $randomCard = GetCard($rs,$rn); 
     if(!in_array($randomCard,$card)){ 
      $card[i] = GetCard($rs,$rn); 
      echo $card[i]; 
      echo " "; 
      $i++; 
     }else{ 
      echo " found "; 
     } 
    } 
    } 
     GetRandomPokerHand(); 
?> 

我拿到手的,但是......每隔一段时间in_array失败,我得到同样的卡的两倍。我用“发现”添加了“else”语句,以查看它是否找到了重复。它确实和回声“发现”,偶尔它仍然显示重复。所以我决定尝试使用相同的代码(大致相同),当我回家的时候使用C++:(使用“switch”而不是“if”是因为首选项和switch语句在手机上太麻烦了)

#include <iostream> 
#include <string> 
#include <vector> 
#include <time.h> 

using namespace std; 
string suits[4]; 
string num[13]; 
string cards[4][13]; 

string GetCard(int getSuit, int getNumber){ 
    for (int s = 0; s < 4; s++){ 
     for (int n = 0; n < 13; n++){ 
      switch (s){ 
       case 0: 
        suits[s] = "-C"; 
        break; 
       case 1: 
        suits[s] = "-H"; 
        break; 
       case 2: 
        suits[s] = "-S"; 
        break; 
       case 3: 
        suits[s] = "-D"; 
        break; 
      } 
      switch (n){ 
       case 0: 
        num[n] = "A"; 
        break; 
       case 10: 
        num[n] = "J"; 
        break; 
       case 11: 
        num[n] = "Q"; 
        break; 
       case 12: 
        num[n] = "K"; 
        break; 
       default: 
        num[n] = to_string(n + 1); 
        break; 
      } 
      cards[s][n] = num[n] + suits[s]; 
     } 
    } 
    string card = { cards[getSuit][getNumber] }; 
    return card; 
} 

bool in_array(const string &value, const vector<string> &array){ 
    return find(array.begin(), array.end(), value) != array.end(); 
} 

void GetRanddomPokerHand(){ 
    int hand = 0; 
    srand(time(NULL)); 
    while (hand < 5){ 
     int suit = rand() % 4; 
     int value = rand() % 13; 
     string randomCard = GetCard(suit, value); 
     vector<string> card = { "", "", "", "", "" }; 
     if (!in_array(randomCard, card)){ 
      card[hand] = randomCard; 
      cout << card[hand] << endl; 
      hand++; 
     }else{ 
      cout << "found"; 
     } 
    } 
} 


int main(){ 
    GetRanddomPokerHand(); 

    char stop; 
    cin >> stop; // yes, i know this isn't necessary in VE2013 
    return 0; 
} 

同样的问题。我似乎无法弄清楚为什么重复打印在这两种情况下。 任何想法?

回答

2

在C++一个你有这条线的循环

vector<string> card = { "", "", "", "", "" }; 

即每次都创建一个新的空白手里面,所以它永远不会有重复。

+0

哇,糟糕!哈,谢谢!它现在有效 – SilverWolfe

2

$卡[I]需要为$卡[$ i]

您$卡阵列始终只有1个元素这是错误的最后一张牌的原因;)

+0

ACK!这就是为什么你不应该用迷你迷你键盘(手机)编程。谢谢,它修复了它 – SilverWolfe