精華區beta C_Chat 關於我們 聯絡資訊
作者: jpopaholic (日音スキ) 看板: C_Chat 標題: Re: [問題] 關於轉蛋遊戲的都市傳說 時間: Fri Dec 12 02:03:58 2014 ※ 引述《attacksoil (擊壤)》之銘言: : 1. 墊子法: 例如PAD石抽抽不好時先去抽幾發友情抽 : 2. 時段說: 傳說中半夜12:01最容易出金蛋etc. : 3. 歐洲帳號: 有些人怎麼抽臉就是很白 有些人怎麼抽就是臉很黑 : 直覺認為上述這三種應該都只是網民的妄想 : 公司幹嘛去弄這種奇怪的設定 : 不過轉念一想 就像有業配存在一樣 : 公司也不是沒有可能故意讓某些條件下抽蛋機率不均 : 以刺激網路社群討論... : 不知道版上的各位高手有聽過類似的八卦嗎? 就一個程式設計師的角度而言,其實電腦裡的亂數都不是真亂數 而是利用一堆演算法讓產生的亂數趨近於一種特定的分布(ex: 常態分布) http://en.wikipedia.org/wiki/Pseudorandom_number_generator 有興趣可以參考以上wiki或是有關pseudo random 有關的paper =======================若非演算法領域的,以上當題外話========================= ===========================接著是關於程式本身================================= 一般常用的程式語言都會有提供有關亂數的Library 像是C/C++:的rand() (在stdlib.h內) Java的java.util.Random (若想用簡易版的可以用java.util.Math.random()) 可是這些的random()的預設種子是固定的,也就是說利用這些函式呼叫無限次 所得的結果都會是一樣的. 所以通常會提供改變種子的參數. C/C++:srand(int seed) Java: Random r=new Random(long seed) //或是 r.setSeed(long seed) 不同的seed可能會讓random()跑出的結果不一樣,但是相同的seed所跑出的結果 一定會一樣 一個遊戲或程式要在不同的呼叫下產生的結果不同(在遊戲方面,就是廣義的抽獎) 最快而且最方便的方法就是呼叫有關時間的函式 C/C++: time.h , Java: java.util.Date 或與其相關的 java.sql.Time ...... 這兩著有提供可以擷取當下時間的資訊 C/C++: time_t time(NULL) Java: Date now=new Date() C/C++只提供一些函式,利用函式傳的結果得知當下時間,像剛剛的函式結果就是 與1970年1月1日GMT 0時0分0秒 相差的秒數(雖然是用time_t傳回,只是可以跟 int相通) Java則是提供一個class,可以用class內提供的method得取相關資訊. 像是 now.getTime() 這個跟C/C++的函式有點像,只是單位不是秒,是微秒(milliseconds) 回傳是long 能夠得到一個會隨著時間而變化的變數,所以就可以把它拿來當作random的seed 所以以下random的懶人寫法就會變這樣: C/C++: srand(time(NULL)); int result=rand(); Java: Date now=new Date(); Random r=new Random(now.getTime()); int result=r.nextInt(); 但是這樣有一個很大的問題,像C/C++裡的random(), 因為在同樣的時間下(同一秒內),seed會是一樣的,所以所得出的結果會一麼一樣 (同樣的,在Java也有相同問題(同一微秒內)) 這也是會產生原po第二點的現象 所以一個嚴謹的亂數種子碼不能設得太簡易,通常會是一些算式或演算法的結合 所以第一和第三的現象也就會產生, 第一現象就是會去紀錄玩家的行為做成一個變數與原本seed在進行運算,所以就會 變成玩家做特定的動作會讓亂數趨於某些值,當然就一個簡便的程式而言.應該會 是很少做這樣的trigger 至於第三點就想像的很容易,直接利用機器的unique id(或是帳號的unique id) 與原本的seed一起進行運算 這樣子就會產生歐洲和非洲的差異(雖然就社會常理而言,是一個極度不公平 的現象) 當然這樣子也會影響到random產生的結果的集中性 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.116.138.154 ※ 文章網址: http://www.ptt.cc/bbs/C_Chat/M.1418321041.A.655.html
gekido: 快推文 不然別人以為我看不懂(? 12/12 02:06
oscarss07: 恩 跟我想的差不多 12/12 02:07
miityisy: 之前花了點時間了解亂數種子,看到有種在復習的感覺.... 12/12 02:17
officeyuli: 亂數種子既然是以秒甚至微秒慘生的 整整一小時或一分 12/12 02:23
officeyuli: 鐘最好會都抽到好東西啦......我覺得這只是心理上的安 12/12 02:23
officeyuli: 慰作用......會特別去記得那些在特定情況下所遇到的.. 12/12 02:23
officeyuli: ....當把全部時間記錄下應該就會趨於平均 12/12 02:23
wohtp: 我記得以前上計算物理的時候,教授特別警告絕對不要用系統 12/12 02:53
wohtp: 時間當種子 12/12 02:53
wohtp: 不過遊戲對亂數品質的要求也許沒那麼高吧 12/12 02:54
attacksoil: 推 12/12 06:44
bakaworu: 微秒當種子我覺得沒問題吧 12/12 09:18
bakaworu: 同一微秒發生的機會應該不會很高 12/12 09:18
bakaworu: 而且也不知道當時的種子是不是大獎 12/12 09:18
mstar: 以前寫 BASIC 程式,也有 RANDOMIZE TIMER 指令 12/12 09:38
mikeneko: 嗯嗯,跟我想的差不多 12/12 10:15