如何讓玩家相信遊戲是公平的?

轉載自:http://blog.codingnow.com/2014/02/net_gamble.htmlhtml

去賭場參觀過的同窗應該都見過那種押大小的骰子游戲。莊家投擲三枚骰子,把骰盅蓋住,玩家能夠押大或小。開盅後,若是發現三個數字之和大於等於 11 就算大,小於等於 10 就算小。若是你猜對了,莊家就 1 賠 1 算給你籌碼;不然輸掉籌碼。另外,還能夠以不一樣賠率壓數字,或壓三個相同。算法

爲了保障莊家利益,三個相同的數字算不大不小。從機率上講,這讓長時間內莊家必勝。機率分析見這裏數據庫

若是把這個遊戲搬到網絡上如何呢?(注意:網上賭博在不少國家是被禁止的,這裏只作技術分析而已)安全

如何讓玩家相信莊家沒有做弊,真的產生了隨機的骰子呢?服務器

記得網易泡泡曾經在聊天室中作過一個簡單的賭大小的文字遊戲。我一同窗興致勃勃的玩過,他告訴我係統必定做弊過的。他寫了個程序監控每局遊戲開盅前的下注狀況,到最後一秒再下住,永遠下注少的一邊(也就是跟莊),只花了一天時間就刷了無數泡泡幣。網絡

其實這只是遊戲實現者的貪心和無知而已。其實這個遊戲的規則保證了莊家利益,莊家沒有必要做弊。但有些遊戲設計者就是腦子轉不過彎來,的確考慮過做弊。不是連六合彩這種極大化莊家利益的遊戲規則都有流言暴出莊家做弊麼?工具

那麼,是否是網絡版的賭大小必定得不到玩家信任呢?設計

其實有一個簡單的方法能夠向玩家證實骰子的隨機性:htm

  1. 每局遊戲前,先隨機三個 1-6 的數字,並同時生成三個足夠長(好比 80 字符, 長度在屏幕方便顯示的範圍便可)的文本隨機串,把數字附在隨機串的兩端。好比隨機出 2,4,5 這三個數字,就同時生成形如 2xxxxxxxxxxxxxxx2 , 4xxxxxxxxxxxxxxx4, 5xxxxxxxxxxxxxxx5 (xxxx 每次隨機) 的字符串。計算這三個字符串的 md5 值,並事先經過網絡展現給玩家。blog

  2. 玩家收到三個祕密串後開始下注。下注時間有限,只有幾分鐘的時間。因爲 md5 的不可逆性,在這麼短期內,不可能知道串的原文。注:網絡上所謂的 md5 破解,都是基於收集有意義的字符串的 md5 值構成海量的數據庫比對查找的,並不是對 md5 結果作逆運算。純隨機串的 md5 值不可能在很短期求逆。

  3. 下注時間過了後,系統經過網絡公佈事先的三個隨機數字構成的隨機串,也就至關於開盅。這時候,玩家應該認賭服輸了。若是他認爲系統做弊,能夠自行校驗系統公佈的串的 md5 值是否和事先公開的值相等。

如此即可證實,骰子是在玩家下注前就肯定下來的,而不是根據玩家下注的行爲更改讓莊家獲利。

沒錯,如今有數學證實能夠在有限時間構造出另外一個符合規則的串有相同的 md5 值。但那也須要至關的計算能力。若是這個網上賭場開的時間足夠長,是沒有那麼多計算能力支撐長期的做弊的。之因此沒必要選用可能更安全的同類算法,是由於 md5 的普及率和認知程度最高,計算工具也隨手可得而已。

若是想進一步提升信任度,讓玩家相信沒有提早計算出 md5 碰撞值,能夠在隨機的 xxxxx 中進一步加上上一局遊戲的骰子 md5 值,讓每次隨機量都是和上一次相關的。甚至能夠加上上一局遊戲參與玩家的賭注金額。這樣幾乎不可能提交計算某一次遊戲的隨機串的 md5 碰撞。

關於 MD5 的碰撞構造,多個 md5 chunk 比單個 chunk 要容易的多。單 chunk 的碰撞構造在 2012 年的這篇 paperSingle-block collision attack on MD5 中提到的方法的計算複雜度在 2 的 50 次方 MD5 運算量級。不是如今普通的計算機計算能力所能承受的。

雖然不是全部玩家均可以理解這個規則,但規則容易直接在遊戲中公示。服務器記錄全部歷史的數據供玩家備查。仍是很容易取得玩家羣體的信任的。

相關文章
相關標籤/搜索