成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

用 C++ 的方式揭秘 2024 春晚魔術背后的秘密!

開發 前端
今年春晚,屏幕前的很多觀眾跟隨劉謙的撲克牌魔術一起見證了奇跡。今天我用代碼的方式,給大家揭露春晚魔術背后的秘密。

聊一聊

今年春晚,屏幕前的很多觀眾跟隨劉謙的撲克牌魔術一起見證了奇跡,同時也讓全國網友都知道了“小尼的撲克牌沒對上”!

后來我們知道了,原來小尼兩張牌是 Q 和 A。

或許這就是上天送給我們的巧合!

Q 跟 A 合在一起,世間萬事皆有答案。

正如我們的生活:一半是問題、一半是答案。

用 C++ 代碼模擬春晚魔術

1.概述

今天我用代碼的方式,給大家揭露春晚魔術背后的秘密。

僅用代碼模擬整個過程,不探討其數學原理。

2.先看結果

(1) 抽取 4 張牌

首先要隨機抽取 4 張牌,然后撕成兩邊,堆在一起:

(2) 按名字移動牌

把名字長度數量的牌放到底部:

(3) 移動開頭 3 張牌

把開頭的 3 張牌插入剩下牌中間:

(4) 藏牌

把最上面的牌藏起來:

(5) 按地區移牌

根據地區把開頭對應數量的牌插入剩下牌中間:

(6) 按性別扔牌

按性別扔掉開頭對應數量的牌:

(7) 見證奇跡的時刻

依次把開頭的牌挪到末尾:

(8) 好運留下來煩惱丟出去

把開頭的牌挪到末尾,然后扔一張牌,直到剩下一張:

(9) 結果對比

把剩下的牌和藏的牌比較:

3.關鍵知識點

(1) std::shuffle

std::shuffle 是 C++11 中引入的一個函數,用于隨機排列容器中的元素,即洗牌。

(2) std::random_device

std::random_device 是 C++11 中引入的一個隨機數生成器,用于生成隨機數。

std::random_device 通常用于生成種子,然后用這些種子初始化其他隨機數生成器,如 std::mt19937。

(3) std::rotate

std::rotate 是 C++ 標準庫中的一個算法。

該算法用于旋轉容器中的元素,將指定元素移動到容器的開頭,同時將其他元素按照原來的順序移動。

4.完整代碼

void print_cards(const std::vector<std::string>& deck) {
 for (auto& card : deck) {
  std::cout << card<< " ";
 }
 std::cout << std::endl;
 std::cout << std::endl;
}

int main() {
 std::vector<std::string> cards = { "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A" };

 std::cout << "初始撲克牌:" << std::endl ;
 print_cards(cards);
 
 std::random_device rd;
 std::mt19937 g(rd());
 std::shuffle(cards.begin(), cards.end(), g);

 std::cout << "洗牌:" << std::endl;
 print_cards(cards);

 
 std::vector<std::string> random_8_cards;
 for (int i = 0; i < 4; ++i) {
  const auto idx = rd() % cards.size();
  random_8_cards.push_back(cards[idx]);
  cards.erase(cards.begin() + idx);
 }

 std::cout << "隨機抽取 4 張牌:" << std::endl;
 print_cards(random_8_cards);

 for( int i = 0;i < 4;++i)
 {
  random_8_cards.push_back(random_8_cards[i]);
 }
 std::cout << "把牌撕成兩半后疊一塊:" << std::endl;
 print_cards(random_8_cards);

 // 根據名字字數調整牌的順序
 int name_length;
 std::cout << "請輸入名字字數:";
 std::cin >> name_length;
 std::cout << "名字長度為:" << name_length << std::endl;

 std::rotate(random_8_cards.begin(), random_8_cards.begin() + name_length, random_8_cards.end());

 std::cout << "將開頭 "<< name_length <<" 張牌放入底部" << std::endl;
 print_cards(random_8_cards);

 std::rotate(random_8_cards.begin(), random_8_cards.begin() + 3, random_8_cards.begin()+ std::uniform_int_distribution<>(4, static_cast<int>(random_8_cards.size()) - 2)(g));
 std::cout << "把前三張牌隨機插入剩余牌中:" << std::endl;
 print_cards(random_8_cards);

 const std::string hidden_card = random_8_cards.front();
 std::cout << "把最上面的牌為:" << hidden_card << std::endl;
 random_8_cards.erase(random_8_cards.begin());

 std::cout << "把最上面的牌藏起來:" << std::endl;
 print_cards(random_8_cards);
 
 int location;
 std::cout << "請輸入地區,南方人輸入1,北方人輸入2,無法確定輸入3:";
 std::cin >> location;
 std::cout << "地區為:" << location << std::endl;

 std::rotate(random_8_cards.begin(), random_8_cards.begin() + location, random_8_cards.begin() + std::uniform_int_distribution<>(location+1, random_8_cards.size() - 2)(g));
 std::cout << "將開頭 " << location << " 張牌隨機插入剩余牌中" << std::endl;
 print_cards(random_8_cards);

 int gender;
 std::cout << "請輸入性別,男性輸入1,女性輸入2:";
 std::cin >> gender;
 std::cout << "性別為:" << gender << std::endl;
 for (int i = 0; i < gender; ++i) {
  random_8_cards.erase(random_8_cards.begin());
 }
 std::cout << " 扔掉開頭的 "<< gender <<" 張牌" << std::endl;
 print_cards(random_8_cards);

 const std::vector<std::string> temp = {"見","證","奇","跡","的","時","刻"};
 for (const auto& i : temp)
 {
  std::rotate(random_8_cards.begin(), random_8_cards.begin() + 1, random_8_cards.end());
  std::cout << i << std::endl;
  print_cards(random_8_cards);
 }

 while (random_8_cards.size() > 1) {
  random_8_cards.push_back(random_8_cards.front());
  random_8_cards.erase(random_8_cards.begin());
  std::cout <<  "好運留下來" << std::endl;
  print_cards(random_8_cards);

  random_8_cards.erase(random_8_cards.begin());
  std::cout << "煩惱丟出去" << std::endl;
  print_cards(random_8_cards);
 }

 std::cout << "剩余最后一張牌是:" << random_8_cards.front() << std::endl;
 std::cout << "藏起來的一張牌是:" << hidden_card << std::endl;

 return 0;
}

5.結尾

用 C++ 來實現還是很方便的,可能比用 Python 稍微多幾行代碼吧。

所以,你看出來小尼老師是哪一步做錯了嗎?

其實,在這一步已經確定了,只要開頭和結尾牌一樣,就肯定不會錯,剩下的步驟全是障眼法!

責任編輯:趙寧寧 來源: 編程猿來如此
相關推薦

2011-06-22 21:36:49

2024-11-26 00:38:26

2020-04-15 13:55:28

Kubernetes容器

2010-01-15 19:17:48

C++語言

2024-12-09 08:00:00

C++代碼

2024-11-29 14:41:55

2010-01-25 18:05:40

C++語言

2022-12-29 08:00:00

Transforme架構深度學習

2011-04-06 11:21:25

PHPPython

2024-02-26 00:03:00

編程程序開發

2010-01-22 14:53:21

2010-10-25 10:13:16

ibmdwWebSphere

2013-03-01 10:45:36

Nike大數據

2012-05-21 21:53:05

2010-11-25 09:54:14

云計算MapReduce

2010-11-25 10:05:51

云計算GFS

2010-05-24 18:22:56

SNMP協議

2010-11-29 10:28:32

云計算BigTable

2010-12-06 14:28:56

云計算Chubby

2017-09-18 08:52:34

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区三区四区免费观看 | 久久久久久电影 | 99亚洲精品 | 亚洲精品视频免费观看 | 精品久久久一区二区 | 欧美在线观看一区 | 久久99精品久久久久久国产越南 | 日韩精品免费一区二区在线观看 | 亚洲日日操 | 亚洲国产成人精品一区二区 | 一区欧美| 久久国产日本 | 日操操| 久久精品亚洲一区二区三区浴池 | 性生生活大片免费看视频 | 亚洲综合免费 | 超碰97av | 欧美在线观看黄色 | 欧美激情一区二区三级高清视频 | 99精品欧美一区二区三区 | 欧美在线视频一区二区 | 伊人狠狠干 | 亚洲精品一区二区三区四区高清 | 欧洲一区二区在线 | 色播视频在线观看 | 亚洲xxxxx | 欧美在线视频网 | 神马久久春色视频 | 草久在线 | 亚洲综合免费 | 超碰97免费观看 | 亚洲欧美少妇 | 日韩精品一区二区三区在线播放 | 伊人精品在线视频 | 色婷婷av一区二区三区软件 | 天堂一区二区三区 | 91网在线观看 | 国产综合精品 | 亚洲精品久久久一区二区三区 | 久久亚洲综合 | 999精彩视频|