2012-12-12 51 views
1

我正在试图创建一个从随机抽取卡片的程序。问题是我需要使抽签过程实际上是随机的,因为当没有其他因素改变时使用srand和rand时每个抽签是相同的。因此我将它附加到time_t秒,并且能够使绘制半/随机。这是因为我必须等待一秒钟才能改变time_t秒的参数。这是一个问题的原因是,如果我的程序绘制同一张牌两次(这是众所周知的),我的程序再次绘制。因此,如果它确实画两次相同的牌,它将被强制抽出约15次(或更多或更少),直到time_t秒参数改变。有没有办法测量毫秒或其他更小的时间单位,所以我没有这个问题?C++时间和随机函数

下面是代码,虽然对于比赛和组织proceedures检查不连接(仅那些最初的平局之后发生反正。)

int allow = 0; 
    string cards[] = 
    {"02hearts", "03hearts", "04hearts", "05hearts", "06hearts", "07hearts", "08hearts","09hearts", "10hearts", "11hearts", "12hearts", "13hearts", "14hearts", 
    "02clubs", "03clubs", "04clubs", "05clubs", "06clubs", "07clubs", "08clubs", "09clubs", "10clubs", "11clubs", "12clubs","13clubs", "14clubs","14clubs", 
    "02spades", "03spades", "04spades", "05spades", "06spades", "07spades", "08spades", "09spades", "10spades", "11spades", "12spades", "13spades", "14spades", 
    "02diamonds", "03diamonds", "04diamonds", "05diamonds", "06diamonds", "07diamonds", "08diamonds", "09diamonds", "10diamonds", "11diamonds", "12diamonds", "13diamonds", "14diamonds"}; 
    string cardHand [5]; 
    string cardnumbers [5]; 
    int cardInts [5]; 
    string handSuites [5]; 
    char handSuitesChar [5]; 





    //check deck 
    while(allow == 0) 
    { 

    //set clock 
    time_t seconds; 

    time(&seconds); 


    srand((unsigned int) seconds); 

    int type; 

    //initiate counters 
    int n = 0; 
    int n1 = 0; 
    int n2 = 0; 
    int n3 = 0; 
    int n4 = 0; 

    //draw cards 
    while(n < 5) 
    { 
     type = rand() % 52; 
     cardHand[n] = cards[type]; 
     cout << cardHand[n] << ", "; 
     n++; 
    } 


    cout << endl; 

    //pull numbers from cards 
    while(n1 < 5) 
    { 
     string character2; 
     cardnumbers[n1] = cardHand[n1].at(0); 
     character2 = cardHand[n1].at(1); 
     cardnumbers[n1].append(character2); 
     cout << cardnumbers[n1] << ", "; 
     n1++; 
    } 
    cout << endl; 
    cout << endl; 


    //convert numbers to ints 
    while(n2 < 5) 
    { 
     stringstream convert(cardnumbers[n2]); 

     if(!(convert >> cardInts[n2])) 
      cardInts[n2] = 0; 

     cout << cardInts[n2] + 100 << ", "; 

     n2++; 
    } 

    cout << endl; 

    //pull out first letters for suites 
    while (n3 < 5) 
    { 
     handSuites[n3] = cardHand[n3].at(2); 

     cout << handSuites[n3]<< endl; 
     n3++; 
    } 


    //convert letters to chars 
    while (n4 < 5) 
    { 
     stringstream convert(handSuites[n4]); 

     if(!(convert >> handSuitesChar[n4])) 
      handSuitesChar[n4] = 0; 

     cout << handSuitesChar[n4] + 100 << ", "; 
     n4++; 
    } 
+3

不要随意绘制它们。随机洗牌并依次绘制。参见[这个例子](http://en.cppreference.com/w/cpp/algorithm/random_shuffle)使用'std :: random_shuffle'。 –

回答

4

不要叫srand()内循环。在程序开始时调用一次,然后在需要随机数时使用rand()。这会给你一个相当长的伪随机序列。

+0

谢谢!完美工作。 – David

0

正如Rob指出的那样,问题不是rand(),而是 您绘制卡片的方式。没有理由每个 两次绘制相同的卡。你可以使用Rob的建议,然后 洗牌,也可以从 未洗牌的牌组中挑选一张随机牌,然后将其从牌组中移出(与 结尾,然后pop_back交换),以便它不能再次绘制。

当然,绝不要在单个过程中多次播种发电机。