C ++将ctime用于随机数生成器,但仍获得相同的数字

时间:2018-09-03 01:20:08

标签: c++ srand ctime

我是一个初学者,使用ctime和分配了随机数的变量时,我并没有完全理解我在做什么错。每当我调用newCard变量时,它都会不断返回相同的值。对于任何反馈,我们都表示感谢!

该程序是循环的回顾,不能包含用户定义的函数

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
    srand(static_cast<unsigned>(time(0)));

    int total = 0;
    int card1 = rand() % 10 + 1;
    int newCard = rand() % 10 +1;
    char deal, replay;

    do
    {   
         cout << " First Cards: " << card1 << ", " << newCard;
         total = card1 + newCard;
         cout << "\n Total: " << total;
         cout << "\n Do you want another card? (Y/N) ";
         cin >> deal;

         while(deal == 'y' || deal == 'Y')
         {
             cout << "\n New Card = " << newCard;
             total += newCard;
             cout << "\n Total: " << total;

            if(total == 21)
            {
                cout << "\n Congratulations!! BLACKJACK! ";
                cout << "\n Would you like to play again? (Y/N):";
                cin >> replay;
                break;
            }
            else if(total > 21)
            {
                cout << "\n BUST ";
                cout << "\n Would you like to play again? (Y/N):";
                cin >> replay;
                break;
            }

            cout << "\n Would you like another card? (Y/N): ";
            cin >> deal;
         }

         while (deal == 'n' || deal == 'N')
         {
             cout << "\n Would you like to play again? (Y/N): ";
             cin >> replay;
         }
    }
    while(replay == 'y' || replay == 'Y');

    while (replay =='n' || replay == 'N')
    {
        cout << "\n Exiting BlackJack \n\n";
        return 0;
    }
}

3 个答案:

答案 0 :(得分:1)

如果要生成随机数,则需要致电rand()

所以在这里:

int newCard = rand() % 10 +1;

我掷出一个10面的骰子,它朝上5,所以我在标有newCard的纸上写下5。

现在,每当我看我的纸上贴有newCard的纸时,它仍然会说5。每次我看时它都不会改变。

如果要再次滚动,则需要再次滚动并写下新号码,方法是再次运行:

newCard = rand() % 10 +1;

答案 1 :(得分:0)

int card1 = rand() % 10 + 1;
int newCard = rand() % 10 +1;

您正确地发行了前两张牌(a),但是,在此之后的任何时候您实际上都不会发行下一张牌。取而代之的是,您检查的每张据认为是新的卡都只会是第二张发卡的重复。

您需要做的是在玩家击打时实际生成 new 卡。

这就像在循环中插入一行一样简单:

 while(deal == 'y' || deal == 'Y')
 {
     newCard = rand() % 10 +1;              // <<<--- this one.
     cout << "\n New Card = " << newCard;
     :
}

(a)对于大酒杯来说,不是 quitet ,因为十值卡的数量比普通卡多(10 / J / Q / K的值均为十) )。

更好的方法是使用类似以下内容的

newCard = rand() % 13 + 1;
if (newCard > 10) newCard = 10;

答案 2 :(得分:0)

您的问题

像这样,您一开始只打一次rand()

int card1 = rand() % 10 + 1;
int newCard = rand() % 10 +1;

但是,每次您想要一个新值时,都需要像这样重新分配newCard

newCard = rand() % 10 +1;

在再次使用之前。您必须反复调用它以获得新值。

提示

仅因为尚未提及here,所以它很好地说明了为什么您使用std::rand()的原因。虽然其他答案也将产生随机数,但它们的分布可能不正确。 C++提供了一种更好的获取随机数的方法,我建议您尽快习惯随机数。

std::random_device rd;  //Will be used to obtain a seed for the random number engine
std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
std::uniform_int_distribution<> dis(1, 10);

int newCard = dis(mt);

您需要以下标头

#include <random>
#include <iostream>

如果您需要更好的随机性,可以使用random_device而不是mt19937生成器。

因此,我建议一开始就这样做,并从您的代码中删除rand()