偽隨機演算法同步

2022-07-13 05:00:15 字數 1056 閱讀 7319

一般來說網遊要求邏輯在服務端計算,原因是一方面利於玩家之間邏輯同步的實現,另一方面伺服器做仲裁方,防止玩家作弊。但在有些情況下,由於一些邏輯要求的實時性很高,我們不得不把一些邏輯的判斷放在客戶端,以保證遊戲的流暢感。比如動作遊戲中,玩家受擊時的動作切換,如果需要根據屬性邏輯計算的結果切換到不同被動動作,不同的被動動作意味著玩家是否能更快的反擊對方。

在這種情況下,如果伺服器無法直接參與這部分的邏輯計算,那麼伺服器可以驗證客戶端傳來的結果是否與伺服器計算的一致,從而判定客戶端是否有作弊的嫌疑。由於客戶端不需要等待驗證結果,所以遊戲的流暢感被保證了。同時,伺服器能夠判定玩家是否作弊,以此為證據向運營人員反映,從而以運營手段保證遊戲的公平性。

在邏輯計算中,我們一般會使用大量的隨機演算法。伺服器需要對客戶端的隨機結果進行驗證,做驗證的一種方法就是保證伺服器計算的隨機值與客戶端相同。由於我們使用的隨機演算法大多數是偽隨機,也就是說在隨機種子不變的情況下,每一次啟動後,呼叫隨機函式取出的隨機值是可重複的。因此伺服器與客戶端之間的隨機值同步是可以做到的,前提是兩者的隨機數種子相同,隨機演算法相同。完成偽隨機演算法同步需要考慮以下幾步:

第一步是隨機種子,我們可以在戰鬥開始,或者玩家登入後,在伺服器生成乙個隨機種子,併發送到客戶端。以後在客戶端與伺服器上,該玩家的隨機演算法就使用這乙個相同的種子計算。

第二步就是兩邊實現相同的偽隨機演算法。偽隨機演算法一般來說就是乙個數學上的曲線函式,種子是輸入變數,然後由函式計算出結果,就是隨機值。這個隨機值結果會以作為另乙個函式的輸入,計算出下乙個隨機函式使用的種子變數。

第三步我們必須保證客戶端與伺服器計算隨機值的序列一致。也就是說客戶端第n次使用隨機函式計算的值,傳給伺服器,伺服器也必須用第n次使用隨機函式計算的值來驗證。一般來說由於tcp的有序性,只要客戶端按順序計算,按順序發包,伺服器按收包順序依次驗證,就可以保證序列一致了。但在伺服器端情況可能會更加複雜一些。比如說伺服器收包後,可能將包分發到不同的服務上來驗證,由於不同服務執行的順序無法保證,那麼就會有一些問題。解決這個問題的辦法有兩種,第一是隨機值在收包服務中進行,然後把計算出的隨機值發給驗證服務。第二是有一種專門的服務計算隨機值,然後將隨機值結果按順序儲存在資料結構中,其它服務通過序列id從這個服務上面去取隨機值結果。

生成偽隨機數的超級演算法

最近瀏覽 程式設計師論壇 時發現不少好帖,增長了不少知識,現拿其中一則為例與大家共同分享心得。某人提出乙個問題 怎樣才能生成一億個不重複的隨機數?問題表述起來很簡單,似乎只要弄明白什麼叫隨機數以及怎樣用電腦生成隨機數,就能解決問題。隨機數,個人理解為一定範圍內出現的毫無規律的數,比如扔乙個骰子,落在...

的確是偽隨機

c語言的 裡 rand 函式可以產生 0 rand max 包括 之間的隨機數,通常是經過 srand 函式進行初始化後再使用。rand max 的值預設是 32767 即 2 15 1 在 裡的定義是 define rand max 0x7fff 所以如果需要求 a,b 顯然要有 b rand m...

偽隨機與實驗

眾所周知,計算機產生的是偽隨機數。所謂偽隨機,就是 當知道種子和隨機產生演算法之後,就可以完全確定出隨機數序列了。並且這個隨機數序列是迴圈重複的。不同的隨機產生演算法的迴圈週期不同 好的隨機產生演算法的迴圈週期會很長。有的文章提到,可以通過引入系統以外的變數來達到真隨機的目的,比如 unix 維護了...