在這一頁
視訊撲克(加密版)
在這一頁
簡介
本頁面介紹一種使用加密技術來確保所發牌的順序是預定順序的視訊撲克遊戲方法。如果您不熟悉視訊撲克的基本規則,請參閱我的視訊撲克主頁。
就本頁而言,我目前關注的是 Cypto.Games。他們有三個版本的視訊撲克,如下:
- 傑克或更好
- 十或更好
- 紅利撲克
玩家必須下注10個積分,儘管玩家可以選擇加密貨幣的價值。在我看來,10個積分的步驟毫無必要地混淆了遊戲的本質。
公平公正的賭場
Bonus Code
分析
下表展示了我對6-9-20-75-500 J或Better賠率表的分析。右下角單元格顯示回報率為97.97%,相當於賭場優勢為2.03%。
傑克或更好的分析
事件 | 支付 | 組合 | 可能性 | 返回 |
---|---|---|---|---|
皇家同花順 | 500 | 34,706,466 | 0.000021 | 0.010447 |
同花順 | 75 | 184,178,161 | 0.000111 | 0.008316 |
四條 | 20 | 3,924,486,891 | 0.002363 | 0.047252 |
客滿 | 9 | 19,115,939,799 | 0.011508 | 0.103572 |
沖洗 | 6 | 19,427,500,088 | 0.011696 | 0.070173 |
直的 | 4 | 18,354,238,557 | 0.011049 | 0.044198 |
三張同點牌 | 3 | 123,573,760,275 | 0.074393 | 0.223178 |
兩對 | 2 | 214,462,314,819 | 0.129108 | 0.258217 |
傑克或更好 | 1 | 356,047,418,052 | 0.214344 | 0.214344 |
所有其他 | 0 | 905,977,999,992 | 0.545408 | 0.000000 |
總計 | 1,661,102,543,100 | 1.000000 | 0.979696 |
下表是我對5-6-22-75-500十或更好賠率表的分析。右下角單元格顯示回報率為97.97%,相當於賭場優勢為2.03%。
十或更好的分析
事件 | 支付 | 組合 | 可能性 | 返回 |
---|---|---|---|---|
皇家同花順 | 500 | 38,106,048 | 0.000023 | 0.011470 |
同花順 | 75 | 187,838,625 | 0.000113 | 0.008481 |
四條 | 22 | 3,915,577,076 | 0.002357 | 0.051859 |
客滿 | 6 | 19,084,542,744 | 0.011489 | 0.068934 |
沖洗 | 5 | 18,600,477,537 | 0.011198 | 0.055988 |
直的 | 4 | 20,611,548,487 | 0.012408 | 0.049633 |
三張同點牌 | 3 | 123,201,590,075 | 0.074169 | 0.222506 |
兩對 | 2 | 213,933,852,009 | 0.128790 | 0.257581 |
十或更好 | 1 | 420,598,763,532 | 0.253205 | 0.253205 |
所有其他 | 0 | 840,930,246,967 | 0.506248 | 0.000000 |
總計 | 1,661,102,543,100 | 1.000000 | 0.979657 |
下表是我對5-8-25-35-75-45-500紅利撲克賠率表的分析。右下角單元格顯示回報率為97.94%,相當於賭場優勢為2.06%。
十或更好的分析
事件 | 支付 | 組合 | 可能性 | 返回 |
---|---|---|---|---|
皇家同花順 | 500 | 35,737,262 | 0.000022 | 0.010757 |
同花順 | 45 | 172,191,438 | 0.000104 | 0.004665 |
四張 A | 70 | 325,566,459 | 0.000196 | 0.013720 |
四個 2、3、4 | 三十五 | 875,937,305 | 0.000527 | 0.018456 |
四個 5 到 K | 二十五 | 2,725,708,639 | 0.001641 | 0.041023 |
客滿 | 8 | 19,133,720,127 | 0.011519 | 0.092149 |
沖洗 | 5 | 18,714,893,725 | 0.011267 | 0.056333 |
直的 | 4 | 18,432,640,328 | 0.011097 | 0.044387 |
三張同點牌 | 3 | 123,733,729,692 | 0.074489 | 0.223467 |
兩對 | 2 | 214,762,339,278 | 0.129289 | 0.258578 |
傑克或更好 | 1 | 358,572,571,638 | 0.215864 | 0.215864 |
所有其他 | 0 | 903,617,507,209 | 0.543987 | 0.000000 |
總計 | 1,661,102,543,100 | 1.000000 | 0.979398 |
公平遊戲
這種版本的視訊撲克似乎只在加密貨幣線上賭場中玩。簡而言之,遊戲會從0到51之間找到10個唯一的隨機數,每個數的機率為1/52,並將它們映射到牌堆中的十張牌上。前五個隨機數字決定玩家在發牌時會拿到的牌,後五個隨機數字決定玩家在抽牌時依序拿到的牌。例如,如果玩家棄掉兩張牌,那麼他將在抽牌時拿到牌表中的第6張和第7張牌。棄牌的位置無關緊要。
以下關於密碼學應用的解釋假設讀者對此概念有所了解。有關基礎知識,請參閱我的“骰子(加密版)”頁面。對於更高級的讀者,以下是遊戲如何選擇十張隨機卡牌的過程。
- 定義一個名為「position」的指標並將其設為 0。
- 依序加入伺服器和客戶端種子以及伺服器種子。
- 產生步驟 2 中字串的 SHA-512 雜湊值。
- 從步驟 3 中的雜湊「位置」開始,將前兩個字元從十六進位轉換為十進位。
- 從 4 中取出末兩位數字。
- 如果步驟 5 的結果為 51 或更少,並且尚未找到,那麼這將是前十張卡片之一。
- 將“位置”增加 2。
- 不斷重複步驟 4 至 7,直到找到十張獨特的卡片。
- 將從左到右開始發出前五張找到的牌。
- 後五張牌將依序排列,等待抽牌時發出。例如,如果玩家抽了三張牌,那麼他將獲得隊列中的第6、7和8張牌。
- 若要將步驟 6 中的卡片位置轉換為實際卡片,請執行下列操作:
- A. 將步驟 4 的結果除以 13 並取餘數。
- B. 將步驟 11A 的結果映射得到排名,如下所示:0 到 A,1 到 2,2 到 3,…,9 到 10,10 到 J,11 到 Q,12 到 K。
- C. 將步驟 4 的結果除以 13,然後刪除餘數。
- D. 將步驟 11C 的結果對應為花色,如下:0 為黑桃,1 為紅桃,2 為方塊,3 為梅花。
下表顯示了從數字到撲克牌的轉換。
卡牌轉換表
秩 | 黑桃 | 紅心 | 鑽石 | 俱樂部 |
---|---|---|---|---|
一個 | 0 | 十三 | 二十六 | 三十九 |
2 | 1 | 14 | 二十七 | 40 |
3 | 2 | 15 | 二十八 | 41 |
4 | 3 | 16 | 二十九 | 四十二 |
5 | 4 | 17 | 三十 | 43 |
6 | 5 | 18 | 31 | 四十四 |
7 | 6 | 19 | 三十二 | 45 |
8 | 7 | 20 | 33 | 46 |
9 | 8 | 21 | 三十四 | 四十七 |
10 | 9 | 22 | 三十五 | 四十八 |
J | 10 | 23 | 三十六 | 49 |
問 | 11 | 24 | 三十七 | 50 |
鉀 | 12 | 二十五 | 三十八 | 51 |
這很需要一個例子,不是嗎?我們來舉一個例子吧。
在上面的「可能公平」畫面中,我希望完成的兩件重要的事情是選擇我自己的(而不是預設的)客戶端種子(bc7v9bn70d7n07sn),並記錄下一個伺服器種子的雜湊值(64e701539ecf4c03b90ecd957d6675b2f72c3fd84f04dc5eb63eed8b9a58b95b),它位於標題為「下一個伺服器種子SHA256”的行中。
在上面的畫面中,我持有不同花色的 J/A,分別位於第一和第四個位置。
在上面的畫面中,我的牌改進為一對 J。
在上面的螢幕截圖中,我回到「公平遊戲」來觀察賭場如何利用兩顆種子來獲得遊戲中看到的實際牌。
上面的畫面顯示了我需要知道的訊息,以便確定應該發哪些牌。讓我一步一步來講解一下:
- 說明很模糊,但你應該按順序加入伺服器種子和客戶端種子。這樣你就能得到 2XMpPAbEw3qdH3HQla2K5zNwoNEFHOEYolkB969jbc7v9bn70d7n07sn。
- 接下來,將步驟 1 的結果進行雜湊處理。結果為3a959bbaffd9b3928b28431c2ee688792c67a45f1933b9e11af3c7784a7bbda5674d2e768ac330a04982b9fa943c4c249968ac330a04982b9fa943c4c2499696d請注意,每個字元都是 0 到 9 的數字或 A 到 F 的字母。用十六進位表示,整個結果是一個非常大的數字。
- 取哈希值(3a)中的前兩個字符,並將其從十六進位轉換為十進位:3*16 1 + a*16 0 = 48 + 10 = 58。
- 取步驟3的末兩位數字(只有兩位數字),仍為58。
- 如果步驟4的結果在0到51之間,則將其對應到一張卡片上。由於58>51,我們繼續哈希值中的後兩位數字。
- 哈希中的下兩位數字是 95。以 10 為基數,這轉換為 9*16 1 + 5*16 0 = 144 + 5 = 149。
- 149 的末兩位數是 49,介於 0 到 51 之間,因此將其映射到一張牌上。具體來說,49 映射到梅花 J。這張牌應該是第一張從左邊開始發出的牌。
- 取雜湊值(9b)中的下兩位數字,並將其從十六進位轉換為十進位:9*16 1 + b*16 0 = 144 + 11 = 155。
- 取最後一步的末兩位數,即55。
- 55 不在 0 到 51 的範圍內,因此在雜湊中跳過這兩位數字。
- 取雜湊值 (ba) 中的下兩位數字,並將其從十六進位轉換為十進位:b*16 1 + a*16 0 = 11*16 + 10*1 = 176 + 10 = 186。
- 取最後一步的末兩位數,即86。
- 86 不在 0 到 51 的範圍內,因此在雜湊中跳過這兩位數字。
- 取哈希值 (ff) 中的下兩位數字,並將其從十六進位轉換為十進位:f*16 1 + f*16 0 = 15*16 + 15*1 = 240 + 15 = 255。
- 取最後一步的末兩位數,即55。
- 55 不在 0 到 51 的範圍內,因此在雜湊中跳過這兩位數字。
- 取雜湊值 (d9) 中的下兩位數字,並將其從十六進位轉換為十進位:d*16 1 + 9*16 0 = 13*16 + 9*1 = 208 + 9 = 217。
- 取上一步的末兩位數,即17。
- 17 在 0 到 51 的範圍內,所以將其對應到一張牌上。具體來說,17 映射到紅桃 5。這應該是從左邊數第二張牌。
- 取雜湊值(b3)中的下兩位數字,並將它們從十六進位轉換為十進位:11*16 1 + 3*16 0 = 13*16 + 9*1 = 176 + 3 = 179。
- 取最後一步的末兩位數,即79。
- 79 不在 0 到 51 的範圍內,因此在雜湊中跳過這兩位數字。
- 取雜湊值(92)中的下兩位數字,並將其從十六進位轉換為十進位:9*16 1 + 2*16 0 = 9*16 + 2*1 = 208 + 9 = 146。
- 取最後一步的末兩位數,即46。
- 46 的範圍是 0 到 51,所以將其映射到一張牌上。具體來說,46 映射到 8 或梅花。這應該是從左邊數起第三張牌。
- 取雜湊值(8b)中的下兩位數字,並將其從十六進位轉換為十進位:8*16 1 + 11*16 0 = 9*16 + 2*1 = 128 + 11 = 139。
- 取最後一步的末兩位數,即39。
- 39 的範圍是 0 到 51,所以將其映射到一張牌上。具體來說,39 映射到梅花 A。這張牌應該是從左邊數起第四張牌。
- 取雜湊值(28)中的下兩位數字,並將其從十六進位轉換為十進位:2*16 1 + 8*16 0 = 2*16 + 8*1 = 32 + 8 = 40。
- 40 的點數在 0 到 51 之間,所以它對應一張牌。具體來說,40 對應梅花 2。這張牌應該是這手牌中最後一張牌,在右邊。
- 我丟棄了三張牌,這意味著我們需要在 Hash 中找到接下來的三張獨特的牌來替換它們。
- 取雜湊值(43)中的下兩位數字,並將其從十六進位轉換為十進位:4*16 1 + 3*16 0 = 4*16 + 3*1 = 67。
- 取雜湊值(1c)中的下兩位數字,並將其從十六進位轉換為十進位:1*16 1 + c*16 0 = 1*16 + 12*1 = 38。
- 38 在 0 到 51 的範圍內,是唯一的,所以把它映射到一張牌上,也就是方塊 3。這是抽到的第一張牌。
- 取雜湊值 (2e) 中的下兩位數字,並將其從十六進位轉換為十進位:2*16 1 + e*16 0 = 2*16 + 14*1 = 32 + 14 = 46。
- 46 也已經在哈希中找到,所以我們跳過這兩個位置。
- 取雜湊值 (e6) 中的下兩位數字,並將其從十六進位轉換為十進位:e*16 1 + 6*16 0 = 14*16 + 6*1 = 230。
- 取最後一步的末兩位數,即30。
- 30 位於 0 到 51 的範圍內,尚未找到,因此將其映射到一張牌上。具體來說,30 映射到方塊 5。這將是第二張替換牌。
- 取雜湊值(88)中的下兩位數字,並將其從十六進位轉換為十進位:8*16 1 + 8*16 0 = 136。
- 取上一步的末兩位數,即36。
- 36 位於 0 到 51 的範圍內,尚未找到,因此將其映射到一張牌上。具體來說,36 映射到方塊 J。這將是第三張替換牌。
- 我們不需要再找牌了。這手牌已經準備好計分,玩家可以付錢了。
總而言之,下表每次顯示來自哈希、十進制轉換和卡片轉換(如果有)的兩個字元。
哈希到卡的轉換
哈希 人物 | 十進位 轉換 | 右二 數位 | 播放 卡片 |
---|---|---|---|
3a | 58 | 58 | 或者 |
95 | 49 | 49 | 梅花 J |
9b | 155 | 55 | 或者 |
巴 | 186 | 86 | 或者 |
ff | 55 | 55 | 或者 |
d9 | 217 | 17 | 紅桃5 |
b3 | 179 | 79 | 或者 |
92 | 146 | 46 | 梅花 8 |
8b | 139 | 三十九 | 梅花 A |
二十八 | 40 | 40 | 梅花2 |
43 | 67 | 67 | 或者 |
1c | 二十八 | 二十八 | 3顆鑽石 |
2e | 46 | 46 | 右/右/左 |
e6 | 230 | 三十 | 5張方塊 |
88 | 136 | 三十六 | 方塊 J |
鑰匙:
o/r = 十進位轉換超出卡片的範圍
r/p/c = 重複上一張牌
如果為了確保公平結果而費盡周折,那麼我有個好消息要告訴你!我寫了一個腳本來幫你完成,它保存在PHP 沙盒中。這是一個很棒的資源!要使用它,只需在第 4 行輸入伺服器(賭場)種子,在第 5 行輸入客戶端(你自己的)種子,然後點擊「執行程式碼」。你注定獲得的牌就會顯示在下面的結果框中。
如果那裡的程式碼出現任何問題,您可以點擊下面的按鈕查看程式碼。
本頁面介紹一種使用加密技術來確保所發牌的順序是預定順序的視訊撲克遊戲方法。如果您不熟悉視訊撲克的基本規則,請參閱我的視訊撲克主頁。
就本頁而言,我目前關注的是 Cypto.Games。他們有三個版本的視訊撲克,如下:
- 傑克或更好
- 十或更好
- 紅利撲克
玩家必須下注10個積分,儘管玩家可以選擇加密貨幣的價值。在我看來,10個積分的步驟毫無必要地混淆了遊戲的本質。
接下來,點選「執行程式碼」。您預定獲得的卡牌將顯示在下面的結果框中,同時也會驗證伺服器種子的雜湊值是否與下注前提供的雜湊值一致。
我還提供了下面的程式碼副本。
[劇透=視訊撲克公平遊戲規則]
// Crypto.Games 的視訊撲克遊戲轉換 $server_seed = "2XMpPAbEw3qdH3HQla2K5zNwoNEFHOEYolkB969j"; $client_seed =“bc7v9bn70d7n07sn”; $next_hash = “64e701539ecf4c03b90ecd957d6675b2f72c3fd84f04dc5eb63eed8b9a58b95b”; $rank_array=array("A",2,3,4,5,6,7,8,9,10,"J","Q","K"); $suit_array=array("黑桃","紅心","方塊","梅花"); $cards_found=0; $位置=0; $combined_seed = $server_seed.$client_seed; echo "組合種子 = $combined_seed\n"; $combined_hash = hash('sha512', $combined_seed); echo“組合種子的雜湊值=$combined_hash\n”; 做 { $first_two=substr($combined_hash,$position,2); $hex_to_dec=hexdec($first_two)%100; 如果 ($hex_to_dec <=51) { $重複=0; 如果 ($cards_found>0) { 對於 ($i=0; $i<$cards_found; $i++) { 如果($hex_to_dec == $card_array[$i]) { $重複=1; } } } 如果 ($repeat==0) { $card_array[$cards_found] = $hex_to_dec; $game_position=1+($cards_found%5); $cards_found++; $rank=$hex_to_dec%13; $suit=intdiv($hex_to_dec,13)%4; 如果 ($cards_found<=5) { echo "發牌 $game_position =\t$rank_array[$rank] of $suit_array[$suit]\n"; } 別的 { echo "抽牌 $game_position =\t$rank_array[$rank] of $suit_array[$suit]\n"; } } } $位置+=2; 如果 ($位置==128) { echo“錯誤——哈希中沒有更多空間。\n”; $cards_found=10; } } 當 ($cards_found<10) 時; $server_seed_hash = hash('sha256', $server_seed); 如果 ($server_seed_hash==$next_hash) { echo "伺服器種子符合.\n"; } 別的 { echo「伺服器種子不符!\n」; echo "伺服器種子 =\t$server_seed\n"; echo「伺服器種子雜湊=\t$server_seed_hash\n」; echo“所謂的下一個哈希=\t$next_hash\n”; } // 程式 // 1. 將「位置」步進至 0。 // 2. 依序加入伺服器和客戶端種子以及伺服器種子。 // 3. 產生步驟 2 字串的 SHA-512 雜湊值。 // 4. 從步驟 3 中的雜湊「位置」開始,將前兩個字元從十六進位轉換為十進位。 // 5. 從 4 中取出末兩位數字。 // 6. 如果步驟 5 的結果為 51 或更小,且尚未找到,那麼這將是前十張卡片之一。 // 7. 將「位置」增加 2。 // 8. 不斷重複步驟 4 到 7,直到找到十張不同的卡片。 // 9. 找到的前五張牌將從左到右開始發牌。 // 10. 後五張牌將依序排列,等待抽牌。例如,如果玩家抽了三張牌,那麼他將獲得隊列中的第 6、7 和 8 張牌。// 11 若要將步驟 6 中的牌位置轉換為實際牌,請執行下列動作: // A. 將步驟 4 的結果除以 13 並取餘數。 // B. 將步驟 11A 的結果對應到等級,如下所示:0 到 A,1 到 2,2 到 3,...,9 到 10,10 到 J,11 到 Q,12 到 K。 // C. 將步驟 4 的結果除以 13 並丟棄餘數。 // D. 將步驟 11C 的結果對應到花色,如下所示:0 到黑桃,1 到紅心,2 到方塊,3 到梅花。 ?>[劇透]