随机化(随机播放)多维数组到另一个二维数组
问题描述:
// deck of cards
// below are initializations
#include <iostream>
#include <fstream>
#include <ctime>
using namespace std;
int main()
{
ofstream myfile; //setup for copy to text file
const char usdeck[4][13][14] = //create 3d array of 52 cards
{
{"heart two", "heart three", "heart four",
"heart five", "heart six", "heart seven",
"heart eight","heart nine", "heart ten",
"heart jack","heart queen", "heart king",
"heart ace"},
{"diamond two", "diamond three", "diamond four",
"diamond five", "diamond six", "diamond seven",
"diamond eight", "diamond nine", "diamond ten",
"diamond jack", "diamond queen", "diamond king",
"diamond ace"},
{"club two", "club three", "club four", "club five",
"club six", "club seven", "club eight", "club nine",
"club ten", "club jack", "club queen", "club king",
"club ace"},
{"spade two", "spade three", "spade four",
"spade five", "spade six", "spade seven",
"spade eight", "spade nine", "spade ten",
"spade jack", "spade queen", "spade king",
"spade ace"}
};
for(int row=0;row<4; row++)
{
for(int column=0;column<13;column++)
{
for(int element=0;element<14;element++)
{
cout << usdeck[row][column][element] << " ";
}
cout <<endl;
}
}
myfile.open("UnshuffledDeck.txt");//creates a text file to place unshuffled deck into
for(int row=0;row<4; row++)
{
for(int column=0;column<13;column++)
{
for(int element=0;element<14;element++)
{
myfile << usdeck[row][column][element] << " ";
//this creates the unshuffled deck text file
}
myfile <<endl;
}
}
myfile.close(); //closes unshuffled deck text file
return 0;
}
void Shuffle()
{
int temp;
char theDeck[4][13];
srand(time(0));
for (int i=0; i<=51; i++)
{
int j = 1 + rand()%52;
int k = 1 + rand()%52;
temp = theDeck[j];
theDeck[j]=theDeck[k];
theDeck[k]=temp;
}
}
我想洗牌在我的甲板。我写了下面的函数随机我相信洗牌一副牌,但我不知道如何实施它..我的“洗牌”甲板需要在2D阵列实施..请帮助!随机化(随机播放)多维数组到另一个二维数组
答
我会建议您采用随机日常使用克努特洗牌。第ku shuffle只需要52张牌换52张牌。
的Knuth的洗牌可以推广到多个维度。然而,将它洗牌并使用它就好像它是一维数组一样容易,但如果它是3D数组,则可以访问它。
*,你可以用它来实现它的一些非常简单的伪代码:
http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#The_modern_algorithm
如果您需要帮助学习如何处理一维数组,就好像它是一个三维阵列,查找一些资料对行优先顺序: https://courses.engr.illinois.edu/ece390/books/artofasm/CH05/CH05-2.html#HEADING2-105
答
你可以让你的生活变得更加简单,如果你:
- 使用代表卡的
0 - 51
之间的整数。 - 鉴于
0 <= N <= 51
,您可以将N/13
作为该卡的套件,将N%13
作为该卡的面。 - 可以代表套房的字符串版本,并使用静态数组的面孔和得到套件的名称和索引到这些静态数组的一个卡面的名称。
- 您可以开始了与被订购一台,然后洗牌他们多次如你所愿使用
std::shuffle
。
这里有一个程序,做到这一点。
#include <cassert>
#include <iostream>
#include <vector>
#include <algorithm>
#include <random>
#include <chrono>
// Represent cards by numbers 0 - 51.
// Given 0 <= N <= 51,
// suite = N/13
// face = N%13.
std::string const& getSuiteName(unsigned int index)
{
static std::string suites[4] = {"Club", "Diamond", "Heart", "Spade"};
assert(index < 4);
return suites[index];
}
std::string const& getFaceName(unsigned int index)
{
static std::string cards[13] =
{
"Two", "Three", "Four", "Five",
"Six", "Seven", "Eight", "Nine",
"Ten", "Jack", "Queen", "King", "Ace"
};
assert(index < 13);
return cards[index];
}
unsigned int getSuiteIndex(unsigned int card)
{
return card/13;
}
unsigned int getFaceIndex(unsigned int card)
{
return card%13;
}
void printCards(std::vector<unsigned int> const& cards)
{
std::cout << "---------------\n";
for(auto card : cards)
{
std::cout
<< getSuiteName(getSuiteIndex(card)) << " "
<< getFaceName(getFaceIndex(card)) << std::endl;
}
std::cout << "---------------\n\n";
}
void shuffleCards(std::vector<unsigned int>& cards)
{
// obtain a time-based seed:
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
// Shuffle the deck.
std::shuffle(cards.begin(), cards.end(), std::default_random_engine(seed));
}
void testShuffle()
{
std::vector<unsigned int> cards;
for (unsigned int i = 0; i < 52; ++i)
{
cards.push_back(i);
}
printCards(cards);
shuffleCards(cards);
printCards(cards);
shuffleCards(cards);
printCards(cards);
}
int main()
{
testShuffle();
return 0;
}
ewwwww indent the code :) – 2014-09-04 03:38:45
它最有可能不足以做52次卡片掉期洗牌。您最有效的洗牌将是清空卡组,然后随机将卡重新放入。 – jackarms 2014-09-04 03:39:11
为什么不是一张一卡的卡?这很容易:'std :: string myCards [52] = {“heart two”,“heart three”,等等}。然后,你需要的只是'std :: random_shuffle'而不是所有的代码。因为没有人只是在俱乐部,心脏,黑桃和钻石中洗牌,所以你在洗牌的第二套牌的要求在现实世界中是没有意义的。你洗牌整个甲板。 – PaulMcKenzie 2014-09-04 04:13:03